java中的错误计算

时间:2014-12-27 10:46:27

标签: java math sum double

当我尝试得到(14.99 + 1.5)和(15.99 + 1.5)的答案时,我的程序给了我不同的输出,这是我没想到的。有什么理由吗?

这是我的简单程序:

class Demo {
    public static void main(String[] args) {

        System.out.println(12.99 + 1.5);           
        System.out.println(13.99 + 1.5);           
        System.out.println(14.99 + 1.5);           
        System.out.println(15.99 + 1.5);           
        System.out.println(16.99 + 1.5);           

    }
}

这是输出: enter image description here

我的JDK版本:1.7.0_25

1 个答案:

答案 0 :(得分:1)

  

我的程序给了我错误的输出。

这是double的正确输出,而不是您所期望的。

浮点近似于无法准确表示的值。在这种情况下,1.5被准确地表示为两个2 ^ 0 + 2 ^ -1的一个或多个幂,但是12.99需要近似。当你打印一个浮点数时,它“知道”这个数字是近似值,需要四舍五入到最简单的数字,这个数字会产生重复,即14.49恰好是你所期望的。 14.99 + 1.5的值有点太小,您会看到表示错误,即精确值的错觉被解除。

当你做浮点数时,你需要提供预期的舍入,你将得到预期的答案(在界限范围内,由于double的精度有限,舍入时非常大的数字仍然是错误的)

    System.out.printf("%.2f%n", 12.99 + 1.5);           
    System.out.printf("%.2f%n", 13.99 + 1.5);           
    System.out.printf("%.2f%n", 14.99 + 1.5);           
    System.out.printf("%.2f%n", 15.99 + 1.5);           
    System.out.printf("%.2f%n", 16.99 + 1.5);

打印

 14.49
 15.49
 16.49
 17.49
 18.49

正如所料。