【问题标题】:Accuracy of double precision multiplication in java?java中双精度乘法的准确性?
【发布时间】:2011-06-23 19:06:32
【问题描述】:

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

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

【问题讨论】:

  • daba:这取决于你的乘法数字,看看浮点数是如何在 Java(和大多数语言)中实现的。 Java 中的浮点数主要是 IEEE-754。我建议阅读以下引人入胜的内容:“每个计算机科学家都应该了解浮点数” download.oracle.com/docs/cd/E19957-01/806-3568/… 请注意名称中的“科学家”:如果您不进行科学计算,那么您如果您使用浮点数,则可能是错误的。

标签: java floating-point multiplication double-precision


【解决方案1】:

乘法工作正常,但2.2 不能完全表示为双精度数。最接近的双打是:

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

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

【讨论】:

  • 谢谢,我错误地认为 println 打印 2.2 意味着它是准确的
【解决方案2】:

如果您正在处理财务数据,请不要使用float or double,只需使用java.math.BigDecimal

【讨论】:

  • 你问了关于double的multiple,尝试做同样的操作,但只使用BigDecimal,你的问题就解决了。
  • 我的问题是关于乘法运算的准确性,正如我在What every computer scientist should know about floating-point numbers" 中读到的那样,“IEEE 标准要求加法、减法、乘法和除法的结果必须精确舍入。也就是说,结果必须精确计算,然后四舍五入到最接近的浮点数(使用舍入到偶数)。”,我很惊讶地收到了我没想到的答案。 @duskwuff 在下面解释了为什么会这样。
  • 我已阅读并知道 :),这只是建议,但我理解您的阅读要点!
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多