当我尝试除以1/60或1 /(60 * 60)时,它给出0.甚至在调试器窗口中。我有点困惑,因为2/3或2.5 / 6会给出结果。
我的代码:
int main()
{
double k1 = 1/60;
cout << k1
<< endl;
double k2 = 1/(60*60);
cout << k2
<< endl;
return 0;
}
感谢您的帮助。
答案 0 :(得分:9)
由于两个操作数都是整数,编译器执行整数除法(不计算小数部分)。如果至少有一个操作数是浮点类型(如在其他示例中那样),则另一个操作数被提升并执行浮点除法。
修复
至少创建一个浮点类型的操作数(double
或float
);你可以这样做:
double
字面值 2 (60
为整数,60.0
或60.
为double
,{{ 1}}是60.f
)float
)。就我个人而言,我更喜欢直接使用double(60)
文字 - 而不是演员对中途正常的编译器有任何性能损失,但是对于仅仅使用正确类型的文字感觉“错误”和冗长。 (显然,当两个操作数都是变量而不是文字时, 使用强制转换)
常见异议
“但我将其分配给(double)60
!”
很多新手都被这个事实搞糊涂了,因为他们认为将 1 结果赋给double
应该是对编译器的某种暗示。事实上,它不是。
表达式中的计算/促销是与目标类型完全独立,这只是最后一步。子表达式将根据它们的含量进行评估,而不考虑结果的使用方式,因此所有类型的促销/操作仅取决于操作数的类型。
为什么要进行整数除法?
即使参数都是整数(例如VB6,IIRC),有几种语言会自动执行浮点除法,因为对初学者来说感觉更直观。这与C / C ++中的情况不同:当参数为整数时,除法是积分的,因为在很多情况下你只是不关心小数,和/或出于性能原因而不使用FPU(背景哲学)在C和C ++中,“你不为你不使用的东西买单”。)
显然,问题本可以使用单独的运算符进行积分除法(VB,再次使用double
),但恕我直言,我们在C ++中有足够的运算符。 :)
答案 1 :(得分:2)
编译器会将行double k1 = 1/60
评估为编译时常量。由于数字末尾没有'.0',1/60
将通过整数除法进行评估,因此为0。
答案 2 :(得分:1)
分母也必须是十进制数。
double k1 = 1/60.0; //Should work
否则你的程序基本上会截断所有小数。
LITTLE EXTRA:当你的分母是变量时,你必须施放它:
double k2 = 1/(double)myDenom;