【问题标题】:Why does Java give 2 - (0.10 + 1.05) = 0.8499...? [duplicate]为什么 Java 给出 2 - (0.10 + 1.05) = 0.8499...? [复制]
【发布时间】:2013-08-12 12:42:45
【问题描述】:

我是 java 新手,但有一些编码经验(主要是 PHP 和一些 C++)。

我在程序中的计算遇到了一些问题。当我运行以下代码时:

public class Test {

    public static void main(String[] args) {
        double number = 2 - (0.10 + 1.05);
        System.out.println( number );

        if( number < 0.85 ) System.out.println("to small");

    }
}

我的输出如下:

run:
0.8499999999999999
to small
BUILD SUCCESSFUL (total time: 0 seconds)

我期望 2 - ( 0.10 + 1.05 ) 等于 0.85 但由于某种原因它不是。有谁知道它为什么会这样?

如果这很重要,我正在使用 netbeans 在 Windows 8 上编写版本 7.3.1 和 jdk7u25。如果还有什么我应该补充的,请告诉。

/克里斯

【问题讨论】:

  • 这与(1/3) + (1/3) + (1/3) 无法以固定的十进制精度准确地为您提供1.0 的原因相同。有些数字无法准确表示。

标签: java netbeans


【解决方案1】:

浮点数是指数形式的。由尾数和指数字段组成。由于二进制编码,它们不包含确切的数字,但接近它们。

要获得准确的数字,请使用 BigDecimal - http://docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

【讨论】:

    【解决方案2】:

    这是因为浮点数不能精确地表示其范围内的所有数字,而是取值接近。见:

    http://introcs.cs.princeton.edu/java/91float/

    这也是为什么你永远不应该使用 float 或 double 来存储货币值。

    【讨论】:

      【解决方案3】:

      因为floating point numbers don't work like you think they do。简而言之,并不是所有的数字都可以用浮点格式精确表达,所以当你使用浮点数据类型时,你会看到这样的东西。

      【讨论】:

        猜你喜欢
        • 2014-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 2012-10-24
        • 1970-01-01
        • 2019-04-17
        • 2023-03-31
        相关资源
        最近更新 更多