关于 Java 的一个神奇现象,有没有人可以解答一下的...

2023-05-30 16:58:16 +08:00
 Gct012

在 Java 开发过程中,使用 bigdecimal 记录那些小数点后 N 位的数字,但是在处理比如(1 / 3 * 6)这样的场景时,得到的结果会是 1.999999999999998 。但是在 Oracle 数据库或者是 windows 自带的计算器中,使用 0.33333333333333333 * 6 ,得到的结果均是 2 。想问下 Java 在这一块有什么办法可以做到和其他两个一样的结果么?

2966 次点击
所在节点    程序员
21 条回复
newaccount
2023-05-31 13:09:12 +08:00
@newaccount 说的有点含糊。具体就是套数学公式,转换成只有一个除法计算。最后计算除法的时候同时设置 divide(xxx, scale, roundingMode),这样可以获得最接近结果。另外对于可能有小数的运算(比如乘 0.3 ),提前放大成整数运算,最后再除回去。当成蝴蝶效应好了,中间的精度损失会导致最后结果越偏越多

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/944261

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX