为什么Java会给出2-(0.10&x2B;1.05)=0.8499。。。?

为什么Java会给出2-(0.10&x2B;1.05)=0.8499。。。?,java,netbeans,Java,Netbeans,我对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.pri

我对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");

    }
}
我期望2-(0.10+1.05)等于0.85,但由于某些原因,它不是。有人知道为什么会这样吗

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


/克里斯

因为。简而言之,并不是所有数字都可以用浮点格式精确表示,所以当您使用浮点数据类型时,您会看到类似的情况。

因为。简而言之,并不是所有的数字都可以用浮点格式精确地表示,所以当您使用浮点数据类型时,您会看到类似的情况。

这是因为浮点数字不能精确地表示其范围内的所有数字,但需要一些近似值。见:


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

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


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

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


要获得精确的数字,请使用BigDecimal-。

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

要获得精确的数字,请使用BigDecimal-。

这与
(1/3)+(1/3)+(1/3)
无法以固定的小数精度精确给出
1.0
的原因相同。有些数字无法精确表示。这是同样的原因,
(1/3)+(1/3)+(1/3)
无法以固定的小数精度精确表示
1.0
。有些数字不能精确表示。
run:
0.8499999999999999
to small
BUILD SUCCESSFUL (total time: 0 seconds)