BigDecimal 的奇怪舍入行为?

发布于 2024-12-06 02:37:29 字数 337 浏览 3 评论 0原文

控制台会打印什么内容,为什么?

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

﹉夏雨初晴づ 2024-12-13 02:37:29

我的机器上的结果是:

7.739999999999999
7.740000

这一点也不令我惊讶。在第二种情况下,我们完全处理 BigDecimal,并且总是相乘 - 没有理由出现任何问题。

在第一种情况下,您将 Bi​​gDecimal 转换为双精度型,因此您的代码实际上

double d = 0.0774;
System.out.println(d * 100.0);

值 0.0774 无法精确表示为 double,因此存在差异。

这与 BigDecimal 无关,而与 double 相关。不过,您几乎应该永远BigDecimaldouble 之间进行转换 - 适合在 BigDecimal 中使用的值类型> 几乎总是不合适表示为double值。

The results on my machine are:

7.739999999999999
7.740000

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

double d = 0.0774;
System.out.println(d * 100.0);

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 with double. You should almost never be converting between BigDecimal and double though - the kind of values which are appropriate for use in BigDecimal are almost always inappropriate to represent as double values.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文