2012-09-04 41 views

回答

7

http://en.wikipedia.org/wiki/Rounding#Round_half_to_even

回合一半甚至
甲平局決勝規則是較少偏見是輪一半甚至,即:

如果y的分數爲0.5,那麼q是最靠近y的偶數。因此,例如,+ 23.5變成+24,+ 24.5變成+24。而-23.5 變成-24,如同-24.5。

此方法對稱地對待正值和負值,並且因此 自由符號偏置的。更重要的是,對於y值的合理分佈 ,圓形 數的預期的(平均)值是相同的原始數字。然而,這個規則將爲偶數引入一個趨近於零的偏差,而對於奇數則會引入一個朝向無窮大的偏差。

的這種變體的舍入到最近的方法也被稱爲公正 舍入,收斂舍入,統計學家的四捨五入,荷蘭 四捨五入,高斯圓,奇偶舍入銀行家 四捨五入,並廣泛用於簿記。

這是IEEE 754計算功能 和運營商所使用的默認舍入模式。

>>> "%.2f"%20.325 
'20.32' 
>>> "%.2f"%20.335 
'20.34' 
>>> "%.2f"%20.345 
'20.34' 
>>> "%.2f"%20.355 
'20.36' 

所以,真正的問題應該是爲什麼第三種情況會失敗?

203.25可以精確地用浮點表示來表示,但是0.1不能,原來是一點點超過0.1

>>> 0.1*203.25 
20.325000000000003 

所以它被圍捕

+0

維基百科+1。 –

1

我不知道爲什麼如預期的情況下不工作的具體細節,但如果你想與你的花車嚴格的準確性,使用類似the decimal module

2

這可能是部分答案:

>>> a*.1 
20.325000000000003 
>>> a/10 
20.325 

請參閱@gnibblers解釋關於IEEE 754舍入是如何實現的。

0

您可以用printf來看看發生了什麼

print '%0.20f'%20.325 
20.32499999999999928946 
0

Python文檔爲round()點答案。基本上浮點can't represent some numbers exactly。例如,0.1最終看起來像0.10000000000000001。這種不精確有時會導致意想不到的結果。在給定的容差範圍內使用浮點數進行計算確實非常困難。在你的情況下,0.1 * a計算的原因是因爲它對你想要的舍入方向有點偏向。

如果你確實需要精度,你應該看看使用Decimal module。使用十進制數字也可以是一件雜事,但它確實使得獲得所需的精度變得更容易一些。

相關問題