我运行了我的程序,我在程序日志中看到我的一个参数是错的,所以我试着调试它,
我试图执行此操作:
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;
它给了我一个真实的结果
是什么原因?
答案 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 )),那么答案是对的