java代码产生错误的结果

时间:2013-11-30 12:53:52

标签: java math

我运行了我的程序,我在程序日志中看到我的一个参数是错的,所以我试着调试它,

我试图执行此操作:

double test = ((9 + 13) * (9 + 1594) * (2157 + 13) * (2157 + 1594));

答案必须是287053602220,但它会给我-7.09206612E8

当我尝试

    double t1 = (9 + 13) * (9 + 1594);
    double t2 = (2157 + 13) * (2157 + 1594);
    test = t1 * t2;

它给了我一个真实的结果

是什么原因?

3 个答案:

答案 0 :(得分:5)

第一个等式计算为整数,然后转换为double。并且你延伸到INTEGER_MAX并进入负值。第一个与此相同:

//temp extends INTEGER_MAX so it gets negative.
int temp = (9 + 13) * (9 + 1594) * (2157 + 13) * (2157 + 1594));
double test = = (double) temp;

在第二个中你转换为一个双倍的早期,所以你扩展了值范围,并且没有通过扩展INTEGER_MAX进入负范围。

整数值范围从-2,147,483,648到2,147,483,647。如果您的号码超出范围,则会再次从另一侧开始。这样你的号码就会变成负数。双人的范围从4.94065645841246544e-324d到1.79769313486231570e + 308d。通过在等式中进行转换,您可以扩展值的范围,并且您的数字不会超出范围并从负范围开始。

答案 1 :(得分:1)

你可以看到类型转换,(9 + 13),(9 + 1594),(2157 + 13),(2157 + 1594)都是int,所以用int执行,得到结果然后转换到了flot。你可以试试 double test =((float)(9 + 13)*(float)(9 + 1594)*(float)(2157 + 13)*(float)(2157 + 1594));

答案 2 :(得分:0)

int乘以int,答案也是int,所以它没有给你正确的答案,你可以尝试((9L + 13)*(9 + 1594)*(2157 + 13)*(2157 + 1594 )),那么答案是对的