如何在不运行程序的情况下检测舍入错误?

时间:2018-04-10 19:50:55

标签: java

我在计算机科学课的练习测试中发现了这个问题:

double num1 = 10;
double num2 = 0;

for (int i = 0; i < 50; i++)
{
    num2 += .2;
}

System.out.println(num1 == num2);
System.out.println(num1 / num2 == 1);
System.out.println(num1 - num2 == 0);

a)真实的真实 b)真假假 c)假真假 d)假假真实 e)虚假虚假

正确答案是e。如果您在结尾打印num2,则会获得9.999999999999996。我怎么知道这个?

2 个答案:

答案 0 :(得分:1)

0.2无法准确表示为IEEE 745浮点数,这是Java用于float和double的。可以精确表示的唯一非整数浮点数是2的幂,例如:

  • 0.5 1/2
  • 0.25 1/4
  • 0.75 3/4
  • 0.1875 3/16

无法将0.2(即2/101/5)完全表示为双精度。测试人员希望你知道这一点。

0.2(十进制)是0.0011001100110011 ...二进制(0011,或3/16无休止地重复)。

(没有办法用十进制数字来表示1/31/7,这是同样的问题。)

答案 1 :(得分:0)

您可以使用IEEE 754浮点标准来计算值。

&#39; double&#39;的Java规范原始类型是here