【问题标题】:Calculation problem in JavaJava中的计算问题
【发布时间】:2011-06-03 02:20:24
【问题描述】:

我在用 Java 执行计算时遇到了一点困难。这就是我想要做的-

((0.053800 * (500000/1000)) + 4) * 0.85

在我的 java 应用程序中,它返回 26.264999999999997,如果将其四舍五入到小数点后 2 位,则为 26.26。

但在 MS Excel 中,相同的公式返回 26.265000.. 因此四舍五入的结果是 26.27。

如果我的 Java 应用程序返回不正确的值,我可以做些什么来纠正它?

【问题讨论】:

  • 主要区别可能在于浮点算术和真正的数学(就像手工完成一样)。
  • 嗯?这一切都将按原样以双精度完成,因为 Java 语言规范要求没有“f”修饰符的浮点文字必须是 double,(除了 500000/1000 它将是整数除法(尽管它不会损失任何东西,因为该商没有余数))。
  • 为什么要四舍五入到小数点后两位?如果四舍五入为 3,则它们四舍五入为相同的结果。如果四舍五入为 1,则它们的结果相同。
  • 根据 IEEE 754 标准,实际上 Java 应用程序正在返回正确的值。不幸的是,IEEE 754 算术不同于实数算术,并且涉及对数字的舍入操作。如果您想精确计算实数,请使用 BigDecimal
  • @sean,我认为 QuantumMechanic 是在回复 pst

标签: java floating-point double


【解决方案1】:

请参阅 my answer here 了解正在发生的事情。

【讨论】:

    【解决方案2】:

    以下是一个更好的近似值,在这种情况下会产生相同的值:

    import java.math.BigDecimal;
    import java.math.MathContext;
    
    public class Test {
        public static void main(String[] args) {
            //double d = ((0.053800 * (500000/1000)) + 4) * 0.85;
            BigDecimal d = ((new BigDecimal(0.053800).multiply(new BigDecimal(500000).divide(new BigDecimal(1000)))).add(new BigDecimal(4))).multiply(new BigDecimal(0.85));
            System.out.println(d.round(MathContext.DECIMAL32));
        }
    }
    

    【讨论】:

    • 感谢所有建议我使用 BigDecimal 的人。这确实给出了预期的结果。
    猜你喜欢
    • 2013-09-19
    • 2012-05-04
    • 2012-09-09
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多