为什么Java为具有不同括号的分数给出不同的答案

时间:2016-10-14 06:06:31

标签: java parentheses

我必须计算:1 * 5000 * 500 /(10000 * 24645.16239360158)

但后来意识到我应该将它乘以1000.我得到2个不同的答案取决于我是怎么做的。我不知道为什么,因为括号的位置对于乘法来说无关紧要。非常感谢任何见解!

的System.out.println(Double.toString(1000 * 1 * 5000 * 500 /(10000 * 24645.16239360158)));

输出

-7.283243937828597

肯定不正确,因为它是否定的

的System.out.println(Double.toString(1000 *(1 * 5000 * 500 /(10000 * 24645.16239360158))));

另一方面,输出

10.143978603480635

(正确的)

基本上在第二种情况下,我们在计算结果后将结果乘以1000,并以某种方式起作用。

谢谢!

4 个答案:

答案 0 :(得分:2)

您需要知道int * int会产生int5 * 5)。 int * double会产生double5 * 5.0)。

您可能知道,这些数据类型具有不同的最大大小,并以不同的方式存储值。

以下是其中一些:

enter image description here

您可以使用Integer.MAX_VALUEInteger.MIN_VALUE获取确切的边界。 如果您需要超过这些值,但又想要int,则应使用类BigInteger。它可以处理任意大integers。 否则,您将拥有所谓的overflow,当您执行Integer.MAX_VALUE + 1时,结果将为Integer.MIN_VALUE。如果你还记得这个数字是如何以字节为单位存储的,例如像111那样+1会返回1000但是没有地方可以存储第一个1,你'我会收到000的{​​{1}}。

您还应该知道,当您计算MIN_VALUE时,它不会返回5 / 2而是2.5,因为您将两个2分开,结果也将是{{} 1}}。如果您想拥有int,那么您需要执行类似intdouble的操作。

答案 1 :(得分:1)

此表达式1000 * 1 * 5000 * 500 /(10000 * 24645.16239360158),首先计算1000 * 1 * 5000 * 500,结果为-1794967296,溢出。

此表达式1000 *(1 * 5000 * 500 /(10000 * 24645.16239360158))溢出不会发生。

答案 2 :(得分:0)

任何表达式的评估都由运算符优先级解析器完成。如果您想更改优先级的优先级,您将使用括号。

在第一种情况下' /'和' *'具有相同的优先级table

在第二种情况下' *'正在优先考虑' /'。这就是为什么你得到不同的值作为输出。

答案 3 :(得分:0)

这是因为Java的隐式类型转换。默认情况下,Java会使用int。正如user2357112所评论的那样,这个数字对于int来说太大了。

如果您希望第一个版本正常工作,请添加“d”告诉Java使用双精度版本。

双d = 1000d * 1 * 5000 * 500 /(10000 * 24645.16239360158) 的System.out.println(d);

你会得到: 10.143978603480635

相关问题