我正在寻找一种在 Java 中将两个浮点数相乘的精确方法,我读到我应该使用 BigDecimal,但它并没有按预期工作。我究竟做错了什么?
我的代码:
BigDecimal a = new BigDecimal(3.53);
BigDecimal b = new BigDecimal(3.59);
BigDecimal c = a.multiply(b);
System.out.println(c);
Result:
12.672699999999998796873512674210388041622697702955394242845497954075284496866515837609767913818359375
预期结果:
12.6727
当您使用BigDecimal(double) https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-double-构造函数不能比 a 更精确double
, 使用String
形式代替。喜欢,
BigDecimal a = new BigDecimal("3.53");
BigDecimal b = new BigDecimal("3.59");
BigDecimal c = a.multiply(b);
System.out.println(c);
哪个输出
12.6727
链接的 Javadoc 部分内容是 -
Notes:
-
此构造函数的结果可能有些不可预测。人们可能会认为编写新的BigDecimal(0.1)
在Java中创建一个BigDecimal
它恰好等于 0.1(未缩放的值 1,缩放比例为 1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625
。这是因为 0.1 不能精确地表示为double
(或者就此而言,作为任何有限长度的二进制分数)。因此,无论表面如何,传递给构造函数的值并不完全等于 0.1。
-
另一方面,String 构造函数是完全可以预测的:写new BigDecimal("0.1")
创建一个 BigDecimal ,它是exactly正如人们所期望的那样,等于 0.1。因此,一般建议字符串构造函数 https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html#BigDecimal-java.lang.String-优先使用这个。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)