将两个数精确相乘 Java

Multiply two numbers precisely in Java

我正在寻找一种精确的方法来乘以 Java 中的两个浮点数,我读到我应该使用 BigDecimal,但是它没有按预期工作。我做错了什么?

我的代码:

BigDecimal a = new BigDecimal(3.53);
BigDecimal b = new BigDecimal(3.59);
BigDecimal c = a.multiply(b);

System.out.println(c);

结果:

12.672699999999998796873512674210388041622697702955394242845497954075284496866515837609767913818359375

预期结果:

12.6727

当您使用 BigDecimal(double) 构造函数时,它不能比 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:

  1. The results of this constructor can be somewhat unpredictable. One might assume that writing new BigDecimal(0.1) in Java creates a BigDecimal which is exactly equal to 0.1 (an unscaled value of 1, with a scale of 1), but it is actually equal to 0.1000000000000000055511151231257827021181583404541015625. This is because 0.1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the value that is being passed in to the constructor is not exactly equal to 0.1, appearances notwithstanding.

  2. The String constructor, on the other hand, is perfectly predictable: writing new BigDecimal("0.1") creates a BigDecimal which is exactly equal to 0.1, as one would expect. Therefore, it is generally recommended that the String constructor be used in preference to this one.