double s = 5.3;
double s1 = 4.2;
System.out.println(s-s1);
输出1.0999999999999996
阿神2017-04-17 17:48:37
Java基本資料型別中的float、double型別的實質是浮點數,浮點數不能儲存精確的數據,這樣的話,浮點數在進行計算的時候,計算結果就不是精確的值;
因此,Java提供了一個類別BigDecimal
,如果需要精確的資料運算(例如金額),就可以使用該類,這叫做曲線救國...BigDecimal
,如果需要进行精确的数据运算(比如金额),就可以使用该类,这叫曲线救国...
关于浮点数的底层实现及其原理,这个在计算机原理
計算機原理
之類的課程裡經常講到,可以自行查找相關的資料...🎜巴扎黑2017-04-17 17:48:37
謝邀!為什麼丟失精度我也說不清,但是怎麼解決我是知道的,建議在計算時先把double 等類型轉為String 再放到java.math.BigDecimal 中去進行計算,在計算的時候要使用java. math.BigDecimal自帶的運算方法,如add() ,pide()。 。等等,計算後也會傳回一個 BigDecimal 的對象,然後再使用 doubleValue(), intValue() 等方法轉為基本資料型別。
伊谢尔伦2017-04-17 17:48:37
因為電腦算術是二進制的。
十進制的0.1變成二進制是無限循環小數,肯定得截斷。
對10進制貨幣的加減,可以用BigDecimal類型(有的語言叫Decimal)來避免截斷誤差。
也可以自己定義一個數字類,像matlab做的那樣。
錯誤和誤差是兩回事,最末尾的那點區別,大部分情況都沒關係吧。
舉個例子:用雙精度浮點數計算地球週長,截斷誤差在0.000001毫米數量級,有關係麼?