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