Java中的Float / Double计算错误

时间:2014-02-04 09:59:53

标签: java floating-point double

我们在Java中有一些计算(分区)问题。

显示问题的示例程序:

public class NumberTest {

    public static void main(String[] args) {
        System.out.println("Double value: " + 27.8625d);
        System.out.println("Float value: " + 27.8625f);
        System.out.println("Double value: " + 1000.0d);
        System.out.println("Float value: " + 1000.0f);
        System.out.println("Double calculation: " + 27.8625d/1000.0d);
        System.out.println("Float calculation: " + 27.8625f/1000.0f);
    }

}

输出

Double value: 27.8625  
Float value: 27.8625  
Double value: 1000.0  
Float value: 1000.0  
Double calculation: 0.027862500000000002  
Float calculation: 0.027862499

我希望计算结果为"0.0278625"。为什么float和double计算都有不同的结果?

此致

2 个答案:

答案 0 :(得分:2)

简短的回答是:浮点值以x * 2 ^ y格式存储。 float使用的空间(通常为4个字节)比double(通常为8个字节)少,因此每种数据类型的精度都有限。

通常在使用浮点时,您必须设置预定的精度。例如,不是盲目地打印浮点的toString()值,而是在十进制后将它们格式化为最多5位数:String.format("%.5f", value)

但是有更多关于浮点的知识:What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:-2)

这是因为两种计算的精度都不同。如果你需要的结果比你可以使用

System.out.println(BigDecimal.valueOf(27.8625).divide(BigDecimal.valueOf(1000.0)).doubleValue());