BigDecimal 的奇怪舍入行为?
控制台会打印什么内容,为什么?
1.
BigDecimal BigDecimalNum = new BigDecimal("0.0774");
System.out.println(BigDecimalNum.doubleValue() * 100.00);
2.
BigDecimal BigDecimalNum2 = new BigDecimal("0.0774");
System.out.println(BigDecimalNum2.multiply(new BigDecimal("100.00")));
What would be printed to console and why?
1.
BigDecimal BigDecimalNum = new BigDecimal("0.0774");
System.out.println(BigDecimalNum.doubleValue() * 100.00);
2.
BigDecimal BigDecimalNum2 = new BigDecimal("0.0774");
System.out.println(BigDecimalNum2.multiply(new BigDecimal("100.00")));
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我的机器上的结果是:
这一点也不令我惊讶。在第二种情况下,我们完全处理 BigDecimal,并且总是相乘 - 没有理由出现任何问题。
在第一种情况下,您将 BigDecimal 转换为双精度型,因此您的代码实际上
值 0.0774 无法精确表示为
double
,因此存在差异。这与 BigDecimal 无关,而与 double 相关。不过,您几乎应该永远在
BigDecimal
和double
之间进行转换 - 适合在BigDecimal
中使用的值类型> 几乎总是不合适表示为double
值。The results on my machine are:
This doesn't surprise me at all. In the second case we're dealing entirely with BigDecimal, and always multiplying - there's no reason for anything to go wrong.
In the first case you're converting the BigDecimal to a double, so your code is effectively
The value 0.0774 can't be exactly represented as a
double
, hence the discrepancy.This has nothing to do with
BigDecimal
, and everything to do withdouble
. You should almost never be converting betweenBigDecimal
anddouble
though - the kind of values which are appropriate for use inBigDecimal
are almost always inappropriate to represent asdouble
values.