我在调试的时候做了这行代码: double hola = (1/2) * (double)x.height;
高度是一倍。霍拉只是一个临时名字。为什么我在倍增时变零?
当我调试,我看到x.height = 1,HOLA = 0
我做了什么错?我敢肯定,我做了一些非常简单的错误..
还当我删除双铸造,我做x.height我仍然得到HOLA = 0
我在调试的时候做了这行代码: double hola = (1/2) * (double)x.height;
高度是一倍。霍拉只是一个临时名字。为什么我在倍增时变零?
当我调试,我看到x.height = 1,HOLA = 0
我做了什么错?我敢肯定,我做了一些非常简单的错误..
还当我删除双铸造,我做x.height我仍然得到HOLA = 0
1/2
为零,其余之一。零时间任何东西都是零。
您是不是要写1.0/2.0
?
这么简单的错误,非常感谢。 –
1
和2
均为int
,所以1/2
结果将被流延(截断)为int。 0.5
- >0
。
您需要确保两个操作数的支持小数点:
double hola = (1.0/2) * (double)x.height;
或者:
double hola = ((double)1/2) * (double)x.height;
这是不正确的。结果将是0.它既不会被投射也不会被截断。 –
@DavidSchwartz'1/2'的结果被截断为'0'。 – Rob
不,它不是。 '1/2'的结果是零。这就是整数除法的工作原理。没有东西被截断。你不能把'0.5'表示为一个整数,甚至不能将它截断为零,并且在这里不使用其他表示。 –
划分两个整数将执行整数除法,其给出结果也相同类型(小数部分被截断)。通过显式地将至少一个参数转换为double来对int参数进行非整数除法(这里是double)。所以,你的代码将是:
double hola = (1/(double)2) * (double)x.height;
OR
double hola = ((double)1/2) * (double)x.height;
我真的希望编译器警告这一点。人们总是犯这个错误。 –