首頁  >  問答  >  主體

Java中double相减为什么会出现不精确的现象?

double s = 5.3;
double s1 = 4.2;
System.out.println(s-s1);
输出1.0999999999999996

高洛峰高洛峰2764 天前791

全部回覆(5)我來回復

  • 阿神

    阿神2017-04-17 17:48:37

    Java基本資料型別中的float、double型別的實質是浮點數,浮點數不能儲存精確的數據,這樣的話,浮點數在進行計算的時候,計算結果就不是精確的值;

    因此,Java提供了一個類別BigDecimal,如果需要精確的資料運算(例如金額),就可以使用該類,這叫做曲線救國...BigDecimal,如果需要进行精确的数据运算(比如金额),就可以使用该类,这叫曲线救国...

    关于浮点数的底层实现及其原理,这个在计算机原理

    關於浮點數的底層實現及其原理,這個在計算機原理之類的課程裡經常講到,可以自行查找相關的資料...🎜

    回覆
    0
  • 迷茫

    迷茫2017-04-17 17:48:37

    Java中使用BigDecimal進行浮點數精確計算

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:48:37

    謝邀!為什麼丟失精度我也說不清,但是怎麼解決我是知道的,建議在計算時先把double 等類型轉為String 再放到java.math.BigDecimal 中去進行計算,在計算的時候要使用java. math.BigDecimal自帶的運算方法,如add() ,pide()。 。等等,計算後也會傳回一個 BigDecimal 的對象,然後再使用 doubleValue(), intValue() 等方法轉為基本資料型別。

    回覆
    0
  • 迷茫

    迷茫2017-04-17 17:48:37

    謝邀,這個問題可以參考這篇文章https://zm8.sm-tc.cn/?src=http%3A%2F%2Fz...

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:48:37

    因為電腦算術是二進制的。

    十進制的0.1變成二進制是無限循環小數,肯定得截斷。

    對10進制貨幣的加減,可以用BigDecimal類型(有的語言叫Decimal)來避免截斷誤差。

    也可以自己定義一個數字類,像matlab做的那樣。

    錯誤和誤差是兩回事,最末尾的那點區別,大部分情況都沒關係吧。

    舉個例子:用雙精度浮點數計算地球週長,截斷誤差在0.000001毫米數量級,有關係麼?

    回覆
    0
  • 取消回覆