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

时间:2015-05-27 18:20:30

标签: java floating-point double

我正在开展一个项目,我们正在计算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);
    }

输出是:

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

这三种结果不同。

我很困惑。谁能请你澄清一下这里发生了什么? 感谢。

我经历了一些已经回答的问题,但我只是想要一些方法,我可以用浮动和双打来​​计算。否则我必须改变许多地方。这将是痛苦的。

2 个答案:

答案 0 :(得分:3)

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

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

对于:double value2 = 0.999939 * 0.987792;你将两倍加倍并将其保存为双倍。这是没有强制转换的时间,因此表示永远不会改变(即数据表示中没有潜在的数据丢失)。

对于:double value3 = (double)0.999939f * 0.987792f;,您将乘以浮点数的倍数乘以浮点数。由于Java数学的工作方式,第二个浮点数可能也被转换为double,所以现在你将两个双倍乘以一次浮动导致第三组表示。

因为浮动和双精度具有不同的精度,所以每个都会得到不同的结果。有关浮点运算的更多信息,请参阅here

答案 1 :(得分:1)

当你用“f”字符写一个数字时,它被视为float,意味着它用32位编码,而没有它,它是double,用64位编码。 / p>

位越多,表示十进制数就越准确。这对于具有少量小数的数字没有影响,但在您的情况下它是重要的。

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