2011-06-23 301 views
6

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

例如,2.2 * 100是220.00000000000003,但是220是双数。 220.00000000000003是后220

+1

大巴山:这取决于你的号码multiplicating,看到浮点数字是如何在Java中实现(在大多数语言)。 Java中的浮点数主要是IEEE-754。我建议引人入胜的阅读:*“每个计算机科学家应该知道的浮点数字”* http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html请注意“科学家“的名字:如果你没有进行科学的计算,如果你使用浮点数,你可能是错误的。 – SyntaxT3rr0r

+0

- 关闭ulp! – Atreys

回答

6

乘法工作正常,但2.2不能完全按照双表示。最近的双打:

  • 2.199999999999999733(0x4001999999999999)
  • 2.200000000000000177(0x400199999999999a)

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

+0

谢谢,我错误地认为事实println打印2.2意味着它是确切的 –

3

下一个双重如果您正在使用财务数据时不使用float or double只需使用java.math.BigDecimal

+1

谢谢,但这不是我问的问题 –

+0

你问过double的倍数,试着做同样的操作,但只是使用BigDecimal,你的问题就解决了。 –

+1

我的问题是关于乘法运算的准确性,因为我读过[每个计算机科学家应该知道的关于浮点数的内容](http://download.oracle.com/docs/cd/E19957-01/806 -3568/ncg_goldberg.html)“IEEE标准要求加法,减法,乘法和除法的结果完全取整。也就是说,结果必须精确计算,然后四舍五入到最接近的浮点数(使用round到even)。“,我惊讶地收到了我没有预料到的答案。@duskwuff在下面解释了为什么会发生这种情况。 –

0

可以使用BigDecimal的,但要确保你使用的BigDecimal(串)的结构,而不是的BigDecimal(双)。它们之间的区别是:

enter image description here