2014-02-05 61 views
3

好吧这么基本的问题在这里。不知道为什么程序返回一个int

double test = 1/3 * 3.14; 

我知道你需要做(1.0/3)才能得到实际的双数。但我想知道的是为什么。我会认为,由于你乘以3.14,这将使它成倍增长。

所以我正确地认为,无论周围发生了什么,无论何时在算术方程中使用两个值,如果它们是整数,那么您将得到一个整数值?

即。 x/y * z

虽然x除以y就是程序关心的所有内容,并且如果它们都是整数,您将返回一个整数值?只有当你乘以z(3.14)时它变成了双精度。

+3

这是为什么downvoted?我认为这是一个关于操作优先级的有效问题... – OneChillDude

回答

4

当两个运算符具有相同的优先级时,评估发生从左到右。 */具有相同的优先级。

1/3 * 3.14首先评估1/3。两个操作数都是int,第一个操作是整数除法,结果是int

接下来,result * 3.14被评估。一个操作数是int,另一个操作数是double,我们有混合类型。 Java对我们有帮助,并将int转换为double以保持准确性。发生浮点除法,结果为double

+0

好吧,这正是我的想法,但需要清除它以确保。 – Danrex

+0

只是一个挑剔的问题:'3.14'是一个'double'文字,而不是'float'文字。 – rgettman

+0

@rgettman哈哈我新人有人会让我这一点。在确认你是对的后纠正。 – Rainbolt

2

因为根据算法规则,首先计算1/3。由于它是2整数,所以它是一个整数除法,结果为0.之后,您有一个双重计算,但错误已经发生。

0

我的理解是,这与Java中的自动装箱有关。 Java认为三分之一除以两个整数,所以你会得到一个int(被转换成double)。

如果你做了1/3D,你会得到0.33333333回

+2

你所描述的虽然是正确的,但不是[autoboxing](http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html)。 – rgettman

+0

谢谢,把它和[java文字后缀](http://www.javaying.com/2006/12/whats-java-literal.html)混淆:) –

相关问题