2 Stimmen

Unerwartetes Verhalten bei Dezimalwerten

Früher dachte ich, ich verstehe den Unterschied zwischen decimal und double Werten, aber jetzt kann ich das Verhalten dieses Code-Schnipsels nicht mehr rechtfertigen.

Ich muss die Differenz zwischen zwei Dezimalzahlen in bestimmten Intervallen dividieren, zum Beispiel:

decimal minimum = 0.158;
decimal maximum = 64.0;
decimal delta = (maximum - minimum) / 6; // 10.640333333333333333333333333

Dann erstelle ich die Intervalle in umgekehrter Reihenfolge, aber das erste Ergebnis ist bereits unerwartet:

for (int i = 5; i >= 0; i--)
{
   Interval interval = new Interval(minimum + (delta * i), minimum + (delta * (i + 1));
}

{53.359666666666666666666666665, 63.999999999999999999999999998}

Ich würde erwarten, dass der maximale Wert genau 64 ist. Was übersehe ich hier?

Vielen Dank!

EDIT: Wenn ich double anstelle von decimal verwende, scheint es ordnungsgemäß zu funktionieren!

2voto

John Willemse Punkte 6528

Sie verpassen nichts. Dies ist das Ergebnis von mehrfachem Runden der Zahlen intern, d.h. einer sich vervielfachenden Genauigkeitsverlust. Der Delta-Wert ist nicht genau 10,640333333333333333333333333, sondern die 3en wiederholen sich endlos, was zu einem Genauigkeitsverlust führt, wenn Sie mit diesem Dezimalwert multiplizieren oder dividieren.

Vielleicht könnten Sie es stattdessen so machen:

for (decimal i = maximum; i >= delta; i -= delta)
{
   Interval interval = new Interval(i - delta, i);
}

0voto

Edper Punkte 8799

Double hat eine Genauigkeit von 16 Dezimalstellen, während Decimal eine Genauigkeit von 29 Dezimalstellen hat. Daher wird Double höchstwahrscheinlich auf- oder abrunden als Decimal.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X