這實際上與Python沒有任何關係 - 使用硬件的二進制浮點算法,您會在任何語言中看到相同的行爲。第一個read the docs。
讀完之後,你會更好地理解你是而不是在你的代碼中增加了百分之一。這是您要添加什麼:
>>> from decimal import Decimal
>>> Decimal(.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
該字符串表示的二進制浮點(在C「雙精度」)的精確十進制值近似準確的十進制值0.01。你真的添加的東西比1/100大一點。
控制浮點數字錯誤是被稱爲「數值分析」的字段,是一個非常龐大而複雜的話題。只要您對浮點數只是十進制值的近似值而感到驚訝,請使用decimal
模塊。這會爲你帶來一個「淺」問題的世界。例如,給定這個小修改你的函數:
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root < num:
root += D("0.01")
return root
則:
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
這不是真的更準確,但可能是簡單的例子那麼令人驚訝,因爲現在它的加入正好一一-hundredth。
另一種方法是堅持浮動並添加爲的東西可以完全表示爲二進制浮點形式:值爲I/2**J
。例如,不要添加0.01,而要添加0.125(1/8)或0.0625(1/16)。
然後查找「牛頓法」,用於計算平方根;-)
也許嘗試[小數](http://docs.python.org/2/library/decimal.html)模塊,這是精確設計? – Michael0x2a