• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

Rundungsfehler Lehmverbrauch

DeletedUser

Gast
Hallo,

ich habe mir einen Gebäuderechner programmiert, der mir auch die benötigten Rohstoffe mit ausgibt.

Das funktioniert soweit auch wunderbar, nur habe ich ein kleines Problem:

Er gibt mir beim Lehmverbrauch von Schmiede, Markt und Wall, jeweils Stufe 2 einen falschen Wert aus. Der Wert ist immer -1 des gewollten. Ich habe mir dann mal die nicht gerundeten Ergebnisse ausgeben lassen:

Schmiede: 229,499 (soll 230)
Markt: 127,449 (soll 128)
Wall: 127,449 (soll 128)

Das sind die Formeln:
Ergebnis = Math.Round(180 * (Math.Pow(1.275, (Schmiedestufe - 1))), 0, MidpointRounding.AwayFromZero);
Ergebnis = Math.Round(100 * (Math.Pow(1.275, (Marktstufe - 1))), 0, MidpointRounding.AwayFromZero);
Ergebnis = Math.Round(100 * (Math.Pow(1.275, (Wallstufe - 1))), 0, MidpointRounding.AwayFromZero);


Kam mir da jemand helfen, den richtigen Wert zu ermitteln?
 

TimLim

Gast
C#?

180 * (Math.Pow(1.275, (2 - 1))); ist bei mir 229.5
Math.Round runde aber dennoch ab. Math.Round(229.5) rundet hingegen auf.

Ich nehme an du nutzt floats. Diese sind intern als Brüche gespeichert und sind demnach nicht exakt genau.
Versuche mal die Ergebnisse als decimal anstatt als float zu speichern.

e: also vor dem Runden ;)

Code:
 Ergebnis = Math.Round((decimal)(180 * (Math.Pow(1.275, (Schmiedestufe - 1)))));
 
Zuletzt bearbeitet:

DeletedUser

Gast
Hallo,

ja ich nutze C#.

Als Datentyp nutze ich double. Durch den Parameter "MidpointRounding.AwayFromZero" wird kaufmännisch gerundet (1-4 ab und 5-9 auf). Die Methode funktioniert ja bei allen Gebäudestufen bei allen Gebäuden, außer den dreien.
 

TimLim

Gast
Hallo,

ja ich nutze C#.

Als Datentyp nutze ich double. Durch den Parameter "MidpointRounding.AwayFromZero" wird kaufmännisch gerundet (1-4 ab und 5-9 auf). Die Methode funktioniert ja bei allen Gebäudestufen bei allen Gebäuden, außer den dreien.

Hast du meinen Lösungsvorschlag ausprobiert?
 

DeletedUser

Gast
Bei deiner Implementation kommt die Meldung:

Fehler 143 Der Typ "decimal" kann nicht implizit in "double" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)
 
Oben