为什么以下代码:
System.out.println((int)(19.99 * 100));
产生结果" 1998"?
答案 0 :(得分:9)
舍入错误。如果你在没有演员表的情况下查看计算结果,你会得到:
1998.9999999999998
因此当你转换为int时,小数部分被删除,而不是向上舍入,你得到1998。
道德是,如果你需要一个确切的答案,不要使用float / double。如果你正在谈论像钱这样的离散值,请使用int并处理原子单位(例如便士。)如果你确实需要精确的小数,那么BigDecimal
就是你的朋友。
虽然您可以使用Math.round()
将结果提交到此处,以便将结果带到预期的位置,但这并不适用于所有情况,也无法解决根本问题。
答案 1 :(得分:5)
这是因为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而向下舍入,那就是(int)
你应该期望得到1998年。
另一种选择是
System.out.println(Math.round(19.99 * 100));
答案 2 :(得分:1)
因为19.99 * 100的计算将导致1998.999999并且你将它转换为int它将丢弃它的小数部分。
答案 3 :(得分:1)
这是由于四舍五入的问题。 double
和float
容易出现这些问题,因此建议您使用BigDecimal
类。
此代码应打印出预期内容:
BigDecimal bg = new BigDecimal("19.99");
System.out.println(bg.multiply(new BigDecimal("10")));
这会产生:
199.90
答案 4 :(得分:1)
System.out.println((19.99 * 100));
通过添加 int 来生成结果1998.9999999999998,它会截断小数部分并返回1998
答案 5 :(得分:1)
浮点数据类型(Java中的float和double)只能近似表示大多数十进制值。有关详细信息,请参阅Joshua Bloch's关于此主题的智慧词语。