2

可能重复:
Java 浮点数和双精度数,如何避免 0.0 + 0.1 + ... + 0.1 == 0.9000001?

如何克服 java android 中双倍乘法的精度问题?请注意,我正在将字符串值转换为双精度值。

例如:当我将两个双精度值相乘时:

double d1 = Double.valueOf("0.3").doubleValue() * Double.valueOf("3").doubleValue();
System.out.println("Result of multiplication : "+d1);

我得到以下结果:0.8999999999999999

我得到的一些结果是。

0.6*3=1.7999999999999998;
0.2*0.2=0.04000000000000001;
等等

我想得到以下结果,而不是上述结果。

0.3*3=0.9;
0.6*3=1.8;
0.2*0.2=0.04;

请记住,我不是想将它四舍五入到最接近的整数。

4

3 回答 3

10

您确实应该使用java.math.BigDecimal来避免任何精度问题,并且始终使用 BigDecimal(String) 构造函数。

BigDecimal result = new BigDecimal("0.3").multiply( new BigDecimal("3.0") );
于 2011-11-12T10:58:27.650 回答
1

问题不在于乘法。它以 Double.valueOf("0.3") 开头。该值不能以浮点数精确表示。您应该使用 java.math.BigDecimal,并且您还应该在 Google 上找到一个标题为“每个计算机科学家都应该了解的浮点知识”的页面。

于 2011-11-12T14:25:36.567 回答
0

不幸的是,我不知道有一种简单的方法可以完全按照您的要求进行操作。

就像 Strelok 所说,如果您需要精确的结果,则不应使用浮点类型。但是,对于大多数目的,只需指定输出的舍入精度就足够了。以下代码接近但不完全是您想要的:

System.out.printf("Result of multiplication : %.1g\n", d1);

有关 printf 语法的更多信息,请参阅java.util.Formatter 文档

于 2011-11-12T11:13:01.490 回答