簡體   English   中英

java計算的意外結果

[英]Unexpected result of java calculation

為什么以下代碼:

System.out.println((int)(19.99 * 100));

產生結果“1998”?

舍入錯誤。 如果你在沒有演員表的情況下查看計算結果,你會得到:

1998.9999999999998

因此當你轉換為int時,小數部分被刪除,而不是向上舍入,你得到1998。

道德是,如果你需要一個確切的答案,不要使用float / double。 如果你正在談論像money這樣的離散值,請使用int並處理原子單位(例如pence。)如果你確實需要精確的小數,那么BigDecimal就是你的朋友。

雖然你可以使用Math.round()將結果提交到預期的位置,但這並不適用於所有情況,也無法解決潛在的問題。

那是因為19.99無法准確表示。

System.out.println(new BigDecimal(19.99));

打印實際代表的值,它最接近19.99。

19.989999999999998436805981327779591083526611328125

19.99 * 100

System.out.println(new BigDecimal(19.99 * 100));

是的

1998.999999999999772626324556767940521240234375

問題是你在19.99中有一個表示錯誤,當它乘以100時仍然存在,你會得到一個稍微過小的數字。

如果你乘以100並向下舍入 ,那么你應該期望獲得1998年的(int)

另一種選擇是

System.out.println(Math.round(19.99 * 100));

因為19.99 * 100的計算將導致1998.999999並且你將它轉換為int它將丟棄它的小數部分。

這是由於四舍五入的問題。 doublefloat很容易出現這些問題,這就是為什么建議你使用BigDecimal類。

此代碼應打印預期的內容:

BigDecimal bg = new BigDecimal("19.99");
System.out.println(bg.multiply(new BigDecimal("10")));

這會產生:

199.90

System.out.println((19.99 * 100));

通過添加int cast生成結果1998.9999999999998,它截斷小數部分並返回1998

浮點數據類型(Java中的float和double)只能近似表示大多數十進制值。 有關詳細信息,請參閱Joshua Bloch關於此主題的智慧語言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM