我必须计算: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,并以某种方式起作用。
谢谢!
答案 0 :(得分:2)
您需要知道int * int
会产生int
(5 * 5
)。 int * double
会产生double
(5 * 5.0
)。
您可能知道,这些数据类型具有不同的最大大小,并以不同的方式存储值。
以下是其中一些:
您可以使用Integer.MAX_VALUE
和Integer.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
,那么您需要执行类似int
或double
的操作。
答案 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