1

我对 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 进行编码。如果还有什么我应该补充的,请告诉。

/克里斯

4

3 回答 3

4

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

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

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

于 2013-08-10T20:33:43.850 回答
2

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

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

于 2013-08-10T20:36:06.037 回答
0

因为浮点数不像你想象的那样工作。简而言之,并不是所有的数字都可以用浮点格式精确表示,所以当你使用浮点数据类型时,你会看到这样的事情。

于 2013-08-10T20:31:50.193 回答