[英]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它將丟棄它的小數部分。
這是由於四舍五入的問題。 double
和float
很容易出現這些問題,這就是為什么建議你使用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.