java代码产生错误的结果

0 java math

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

我试图执行这个:

double test = ((9 + 13) * (9 + 1594) * (2157 + 13) * (2157 + 1594));
Run Code Online (Sandbox Code Playgroud)

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

当我尝试

    double t1 = (9 + 13) * (9 + 1594);
    double t2 = (2157 + 13) * (2157 + 1594);
    test = t1 * t2;
Run Code Online (Sandbox Code Playgroud)

它给了我一个真实的结果

是什么原因 ?

Sim*_*ant 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;
Run Code Online (Sandbox Code Playgroud)

在第二个中,您可以提前转换为double,因此您可以扩展值范围,并且不会通过扩展INTEGER_MAX进入负范围.

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