我已經看遍了:Why can't decimal numbers be represented exactly in binary?和Why Are Floating Point Numbers Inaccurate?紅寶石四捨五入和十進制數的格式
我的問題是,當我圓和格式浮動使用紅寶石點數,結果仍然不是做數學的結果不同的買手。下面是這樣一個例子:
編輯2
[28] pry(main)> #####################################
[29] pry(main)> # test one
[30] pry(main)> #####################################
[31] pry(main)> foo = (6.0135 * (650000/1000))
=> 3908.7749999999996
[32] pry(main)> foo = '%.2f' % foo.round(2)
=> "3908.77"
[33] pry(main)> # should be 3908.78
[36] pry(main)> #####################################
[37] pry(main)> # test two
[38] pry(main)> #####################################
[39] pry(main)> foo = 650000/1000
=> 650
[40] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[41] pry(main)> foo = '%.2f' % foo.round(2) # should be 3908.78
=> "3908.77"
[44] pry(main)> #####################################
[45] pry(main)> # test three
[46] pry(main)> #####################################
[47] pry(main)> foo = 650000/1000
=> 650
[48] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[49] pry(main)> foo = foo.round(2) # should be 3908.78
=> 3908.77
[52] pry(main)> #####################################
[53] pry(main)> # test four - The result of test four is expected
[54] pry(main)> #####################################
[55] pry(main)> foo = 650000/1000
=> 650
[56] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[57] pry(main)> foo = '%.2f' % foo
=> "3908.77"
[58] pry(main)> #####################################
[59] pry(main)> # test five
[60] pry(main)> #####################################
[61] pry(main)> foo = 650000/1000
=> 650
[62] pry(main)> foo = foo * 6.0135
=> 3908.7749999999996
[63] pry(main)> foo = foo.round(5)
=> 3908.775
測試1:這是正常的公式我在庫,是給我的問題,請使用。
測試2:在這裏,我的想法是,也許在做一個分配這兩個操作是造成一些問題
測試3:嗯,因爲'%.2f' %
已經知道導致它截斷一些事情的四捨五入問題,也許這就是的問題。
測試4:由於'%.2f' %
不是問題,所以.round(2)
可能導致問題。
編輯2: 測試5:如果我展開一輪在看我得到一個數字,我可以(即24(2)再次證明數。)工作在數字。但是,這似乎是一個有限的案例,而不是一般
工作的一個不可思議的解決方案我真的不關心浮點數是不準確的。我的問題是我如何正確舍入這個數字,以便我得到正確的答案(如果你手動執行操作,你會得到答案)。
另外一般情況下,是否有一個最佳做法舍入來糾正劑量點錯誤?我知道它是用兩個整數來表示浮點數,但這似乎很麻煩。
謝謝。
編輯1
如果您使用的.round(5)
代替.round(2)
比較它的答案應該是什麼的時候,你會得到一個更合理的答案。增加本輪內線的數量是否有任何缺點?
爲什麼downvote? –
這一輪是正確的。 3908.77499999 ..將始終爲3908.77,因爲它確實小於3908.775。你總是圍繞總價值,你不開始在最後一個數字輪,然後出去...... –
除了實際的答案應該是3908.78的事實。如果你使用'.round(5)',你會得到3908.78 –