java中双精度乘法的精度?

java中双精度乘法的精度?,java,floating-point,multiplication,double-precision,Java,Floating Point,Multiplication,Double Precision,java中双值乘法运算符的保证精度是多少 例如,2.2*100是220.00000000000003,但220是一个双精度数字。220.00000000000003是220之后的下一个double。如果处理金融数据,不要使用浮点或double,只需使用java.math.BigDecimal乘法操作正常,但2.2不能精确表示为double。最接近的双打是: 2.19999999999733(0x400199999999999) 2000000000177(0x400199999999A) 有

java中双值乘法运算符的保证精度是多少


例如,2.2*100是220.00000000000003,但220是一个双精度数字。220.00000000000003是220之后的下一个double。

如果处理金融数据,不要使用
浮点或double
,只需使用
java.math.BigDecimal

乘法操作正常,但
2.2
不能精确表示为double。最接近的双打是:

  • 2.19999999999733(0x400199999999999)
  • 2000000000177(0x400199999999A)

有些软件会将后一个值打印为
2.2
,但这并不意味着它是精确的。这只是意味着它被视为“足够接近”。

您可以使用BigDecimal,但请确保使用BigDecimal(String)的构造,而不是BigDecimal(double)。它们之间的区别是:


daba:这取决于乘法的数字,看看Java(以及大多数语言)是如何实现浮点数的。Java中的浮点数主要是IEEE-754。我建议你读下面这段引人入胜的话:“每一位计算机科学家都应该知道的关于浮点数的知识”注意名字中的“科学家”:如果你不是在做科学计算,如果你使用浮点数,你可能是错的。谢谢,我错误地认为println prints 2.2这一事实意味着它是正确的。你问了关于double上的倍数,尝试做相同的运算,但只使用BigDecimal,你的问题就会解决。我的问题是关于乘法运算的准确性,正如我在中读到的“IEEE标准要求加法、减法、乘法和除法的结果必须精确四舍五入。也就是说,结果必须精确计算,然后四舍五入到最接近的浮点数(使用四舍五入到偶数)。“,我很惊讶地收到了我没有预料到的答案。@duskwuff在下面解释了为什么会发生这种情况。我读过它,知道:),这只是一个建议,但我明白你读起来很有道理!