如何解决java中的双精度问题

如何解决java中的双精度问题,java,android,double,double-precision,Java,Android,Double,Double Precision,可能重复: 在java android中,如何克服双重乘法的精度问题?请注意,我正在将字符串值转换为双重值 当我将两个双倍值相乘时: double d1 = Double.valueOf("0.3").doubleValue() * Double.valueOf("3").doubleValue(); System.out.println("Result of multiplication : "+d1); 我得到以下结果:0.899999999999 我得到的一些结果是 0.6*3=1.7

可能重复:

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

当我将两个双倍值相乘时:

double d1 = Double.valueOf("0.3").doubleValue() * Double.valueOf("3").doubleValue();
System.out.println("Result of multiplication : "+d1);
我得到以下结果:0.899999999999

我得到的一些结果是

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

我希望得到以下结果,而不是上面的结果

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


请记住,我并没有试图将其四舍五入到最接近的整数。

您应该使用以避免任何精度问题,并且始终使用BigDecimal(字符串)构造函数

BigDecimal result = new BigDecimal("0.3").multiply( new BigDecimal("3.0") );

不幸的是,我不知道有什么简单的方法可以完全满足你的要求

正如Strelok所说,如果需要精确的结果,就不应该使用浮点类型。然而,在大多数情况下,仅为输出指定舍入精度就足够了。以下代码接近但不完全符合您的要求:

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

有关printf语法的更多信息,请参阅。

问题不在于乘法。它以Double.valueOf(“0.3”)开头。该值不能用浮点精确表示。你应该使用java.math.BigDecimal,你还应该在谷歌上搜索一个名为“每个计算机科学家都应该知道的关于浮点的知识”的页面。

你尝试过DecimalFormat吗?示例:(新的十进制格式(“0.00”).format(doubleValue*1.00000));我不认为说使用BigDecimal可以避免任何精度问题是准确的。在一天结束时,我们必须做出一些牺牲,以在有限的内存中表示尽可能大的数字范围。@AdrianMouat,我很确定如果您按照我指定的方式使用BigDecimal(使用
BigDecimal(String)
constructor构建它),您将避免任何精度问题,而不会做出牺牲。在给定的示例中,当然但是仍然必须有限制。@AdrianMouat唯一的限制是可用内存。BigDecimal不使用浮点,所以它不像double那样有这个问题。@EJP,这和我说的并不矛盾。当数字不能用十进制表示(例如1/3)时,BigDecimal似乎会抛出异常。所以我想你是在牺牲灵活性来换取精确性,你在开玩笑吧。请解释如何准确地用浮点表示0.3。