搜尋

首頁  >  問答  >  主體

关于java double类型运算的困惑

请看下面的代码

double a = 0.001;
double b = 13.456;
System.out.println(a);
System.out.println(b);
System.out.println(a+b);
System.out.println(b-a);

运算的结果是

0.001
13.456
13.456999999999999
13.455;

表示对结果不太理解,难道ab相加的结果不应该是13.457么

高洛峰高洛峰2887 天前347

全部回覆(2)我來回復

  • 迷茫

    迷茫2017-04-17 17:43:32

    double 在運算時會失去精確度,建議使用java.math.BigDecimal 進行運算。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 17:43:32

    這是因為在計算機中浮點數有可能(注意是可能)是不準確的,它只能無限接近準確值,而不能完全精確。為什麼會如此呢?這是由浮點數的儲存規則決定的,我們先來看0.4這個十進制小數如何轉換成二進制小數,使用“乘2取整,順序排列”法(不懂?這就沒招了,太基礎了),我們發現0.4不能使用二進制準確的表示,在二進制數世界裡它是一個無限循環的小數,也就是說,“展示”都不能“展示”,更別說是在內存中存儲了(浮點數的儲存包括三個部分:符號位、指數位、尾數,具體不再介紹),可以這樣理解,在十進制的世界裡沒有辦法準確表示1/3,那在二進制世界裡當然也無法準確表示1/5 (如果二進制也有分數的話倒是可以表示),在二進制的世界裡1/5是一個無限循環小數。

    回覆
    0
  • 取消回覆