2016-03-02 67 views
1

我在调试的时候做了这行代码: double hola = (1/2) * (double)x.height; 高度是一倍。霍拉只是一个临时名字。为什么我在倍增时变零?

当我调试,我看到x.height = 1,HOLA = 0

我做了什么错?我敢肯定,我做了一些非常简单的错误..

还当我删除双铸造,我做x.height我仍然得到HOLA = 0

+1

我真的希望编译器警告这一点。人们总是犯这个错误。 –

回答

6

1/2为零,其余之一。零时间任何东西都是零。

您是不是要写1.0/2.0

+0

这么简单的错误,非常感谢。 –

4

12均为int,所以1/2结果将被流延(截断)为int。 0.5 - >0

您需要确保两个操作数的支持小数点:

double hola = (1.0/2) * (double)x.height; 

或者:

double hola = ((double)1/2) * (double)x.height; 
+0

这是不正确的。结果将是0.它既不会被投射也不会被截断。 –

+3

@DavidSchwartz'1/2'的结果被截断为'0'。 – Rob

+1

不,它不是。 '1/2'的结果是零。这就是整数除法的工作原理。没有东西被截断。你不能把'0.5'表示为一个整数,甚至不能将它截断为零,并且在这里不使用其他表示。 –

0

划分两个整数将执行整数除法,其给出结果也相同类型(小数部分被截断)。通过显式地将至少一个参数转换为double来对int参数进行非整数除法(这里是double)。所以,你的代码将是:

double hola = (1/(double)2) * (double)x.height; 

OR

double hola = ((double)1/2) * (double)x.height; 
相关问题