2009-08-18 9 views
1

Das ist mir sehr seltsam:In Rubin, warum ist "100.7" .to_f.modulo (1) = 0.700000000000003?

irb(main):012:0> "100.7".to_f.modulo(1) 
=> 0.700000000000003 

Warum am Ende der 3?

irb(main):019:0> "10.7".to_f.modulo(1) 
=> 0.699999999999999 

Das gleiche hier ... wir bekommen nur den Rest dieses Wertes geteilt durch eins. Es sollte genau sein.

+2

Duplizieren von fast allen '[Fließkomma]' Fragen. Siehe http://stackoverflow.com/questions/1089018/why-cant-decimal-numbers-be-representsed-exactly-in-binary zum Beispiel. –

+2

Dies ist auch ein Duplikat von etwa 100 Threads auf der Ruby-Talk-Mailingliste, oder in der Tat irgendein Diskussionsforum irgendeiner Programmiersprache, die jemals existiert hat. –

Antwort

0

Dies ist, weil es nicht möglich ist, alle Gleitkommazahlen genau darzustellen.

3

Dies ist eine typische Fließkomma-Rundung. Sie können einfach nicht jede einzelne Dezimalzahl in der festen Anzahl von Bits in einem Float ausdrücken, daher werden einige Werte auf den nächsten Wert gerundet, der dargestellt werden kann.

Aus diesem Grund wird empfohlen, Floats nicht auf Gleichheit zu prüfen. Vergleichen Sie für weniger als oder größer als, aber nie exakte Gleichheit.

http://en.wikipedia.org/wiki/Floating_point#Representable_numbers.2C_conversion_and_rounding

Einfach gesagt, ist es nicht der Fall, dass „es sollte genau sein“. Erwarten Sie das nicht von Dezimalzahlen mit Gleitkommazahlen.

2

Willkommen in Punkt Mathe schwimmen. Es gibt viele Zahlen, die nicht in der Standard-Fließkomma-Notation dargestellt werden können und nur ein kleines bisschen auskommen.

(1..10).collect do |i| 
    v = ((10**i).to_f + 0.7) 
    puts "%13.1f = %.30f" % [ v, v.modulo(1) ] 
end 

Wo ist das Ergebnis::

  10.7 = 0.699999999999999289457264239900 
     100.7 = 0.700000000000002842170943040401 
     1000.7 = 0.700000000000045474735088646412 
     10000.7 = 0.700000000000727595761418342590 
    100000.7 = 0.699999999997089616954326629639 
    1000000.7 = 0.699999999953433871269226074219 
    10000000.7 = 0.699999999254941940307617187500 
    100000000.7 = 0.700000002980232238769531250000 
1000000000.7 = 0.700000047683715820312500000000 
10000000000.7 = 0.700000762939453125000000000000 

Beachten Sie, dass je größer die Zahl wird, desto geringer ist die Genauigkeit über die Nachkommastelle

wie folgt Dies ist leicht dargestellt. Dies liegt daran, dass eine bestimmte Menge an Genauigkeit verfügbar ist, um die gesamte Anzahl darzustellen.