当我尝试得到(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);
}
}
这是输出:
我的JDK版本:1.7.0_25
答案 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
正如所料。