編程語言計算0.1+0.2精度偏差的問題

  在平時若是有人問你0.1+0.2=?的問題,你可能會鄙視他,但在計算機中這倒是一個比較頭疼的問題,先看一個例子:java


結果是多少?python

答案是:
編程


  沒錯,爲何不是指望的0.3呢?編程語言

  先不說爲何,先看看在別的編程語言中的一樣的狀況:spa

在java中:.net


在python中:3d



爲何呢?blog

  咱們知道,計算機中存儲的都是二進制的0和1,而咱們現實中的數存入計算機中轉換爲二進制時有可能不能整除,也就是不能正好整除,因此用二進制表示現實中的數並計算就產生了偏差。bfc

  把十進制的0.1和0.2轉換爲二進制:循環

0.1 => 0.0001 1001 1001 1001…(1001無限循環)
0.2 => 0.0011 0011 0011 0011…(0011無限循環)

可是咱們計算機的硬件存儲的位數是有限制的不可能無限循環下去,通常雙精度浮點數總共佔用64位,其中最多53位爲有效精度數字(包括符號位),因此存儲時:

0.1=>0.0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001

0.2=>0.0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011

0.1+0.2=>

          0.0100 1100 1100 1100 1100 1100 11001 100 1100 1100 1100 1100 1100

轉換爲十進制就是:0.30000000000000004

參考:http://blog.csdn.net/zcczcw/article/details/7362473