2014-12-26 54 views
5

Warum schlägt diese Behauptung fehl?Warum funktioniert nicht! Int() ordnungsgemäß?

import std.conv; 

void main() 
{ 
    auto y = 0.6, delta=0.1; 
    auto r = to!int(y/delta); 
    assert(r == 6); 
} 

r Wert sollte 6 sein und doch ist es 5, warum?

+3

[Ist Fließkomma-Mathematik gebrochen?] (Http://stackoverflow.com/questions/588004/is-floating-point -math-broken) [Was jeder Programmierer über Fließkomma-Arithmetik wissen sollte] (http://floating-point-gui.de/) –

+2

Danach lesen Sie diesen ausführlichen Artikel [Was jeder Informatiker über Fließkomma-Arithmetik wissen sollte ] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

Antwort

5

Dies liegt wahrscheinlich daran, dass 0.6 nicht rein in einer Gleitkommazahl dargestellt werden kann. Sie schreiben 0.6, aber das ist nicht genau das, was Sie bekommen - Sie bekommen etwas wie 0.599999999. Wenn Sie das durch 0,1 teilen, erhalten Sie etwas wie 5.99999999, das zu einer Ganzzahl von 5 konvertiert (durch Abrunden).

Beispiele in anderen Sprachen:

C#: Why is (double)0.6f > (double)(6/10f)?

Java: Can someone please explain me that in java why 0.6 is <0.6f but 0.7is >=0.7f

+1

Wie kann ich dann aufrunden? – Algo

+2

Sie können mit std.math.round auf die nächste Ganzzahl runden: http://dlang.org/library/std/math/round.html. Wenn Sie wissen, dass Ihr Gleitkommaergebnis innerhalb von 0,5 der gewünschten Ganzzahl liegt, wird das Ergebnis auf das Ergebnis gerundet. Zwei Antworten für den Preis von einem! –

+0

Oder durch Hinzufügen von 0,5. Ich benutze (y/delta + 0.5) – runec

4

Computer darstellen Punktzahlen in binärer schweben. Die Dezimalzahlen 0.6 und 0.1 haben keine exakte binäre Darstellung, während die Anzahl der Bits, die für ihre Darstellung verwendet werden, endlich ist. Als Ergebnis würde eine Verkürzung auftreten, deren Wirkung während der Teilung beobachtet wird. Das Ergebnis dieser Division ist nicht genau 6.00000000, aber vielleicht 5.99999999, das dann auf 5 gekürzt wird.

Verwandte Themen