关于java:使用float和double进行计算,给出不同的结果

Using float and double for calculation, giving different results

本问题已经有最佳答案,请猛点这里访问。

我正在做一个项目,我们用8位小数点计算项目的价格。但有时计算结果不同。

我尝试了一些样本,但得到了不同的计算结果:

1
2
3
4
5
6
7
8
    public static void main(String[] args) {
        double value1 =  0.999939f * 0.987792f;
        double value2 =  0.999939 * 0.987792;
        double value3 =  (double)0.999939f * 0.987792f;    
        System.out.println("value 1 :"+ value1);
        System.out.println("value 2:"+ value2);
        System.out.println("value 3 :"+ value3);
    }

输出是:

1
2
3
value 1 : 0.9877317547798157
value 2 : 0.9877317446880001
value 3 : 0.9877317839126931

这三个结果是不同的。

我很困惑。有人能告诉我这里发生了什么吗?谢谢。

我看了一些已经回答过的问题,但我只想找到一些我可以用浮点和双精度计算的方法。否则我得换很多地方。会很痛苦的。


由于浮点数和小数的表示方式,强制转换可能会导致不同的结果。

for:double value1 = 0.999939f * 0.987792f您将两个浮点数相乘,然后将其转换为双精度浮点数。由此产生的浮点表示是转换为double的表示。

对于:double value2 = 0.999939 * 0.987792;,您将得到两个双精度数,并将其保存为一个双精度数。这是没有强制转换的时候,因此表示永远不会更改(即,数据表示更改不会导致潜在的数据丢失)。

对于:double value3 = (double)0.999939f * 0.987792f;,您将一个由浮点数铸造的双精度数乘以一个浮点数。由于Java数学是如何工作的,第二个浮点数也可能被铸造成一个double,所以现在你正在乘以两个双倍,这是一次浮点,导致第三组表示。

因为浮球和双打有不同的精度,每一个都会得到不同的结果。有关浮点运算的更多信息,请参见此处。


当你用"f"字符写一个数字时,它被认为是float,这意味着它是用32位编码的,而没有它,它是用64位编码的double

位数越多,表示十进制数的精度就越高。这对小数点少的数字没有影响,但在您的例子中,它是重要的。

总之,在代码中只使用double变量。