C ++。将1除以任何数字得到0

时间:2012-10-31 17:57:49

标签: c++ division

当我尝试除以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;
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:9)

由于两个操作数都是整数,编译器执行整数除法(不计算小数部分)。如果至少有一个操作数是浮点类型(如在其他示例中那样),则另一个操作数被提升并执行浮点除法。

修复

至少创建一个浮点类型的操作数(doublefloat);你可以这样做:

  • 将其设为double字面值 2 60为整数,60.060.double,{{ 1}}是60.f
  • 使用演员表({{​​1}},float)。

就我个人而言,我更喜欢直接使用double(60)文字 - 而不是演员对中途正常的编译器有任何性能损失,但是对于仅仅使用正确类型的文字感觉“错误”和冗长。 (显然,当两个操作数都是变量而不是文字时, 使用强制转换)

常见异议

  • “但我将其分配给(double)60!”

    很多新手都被这个事实搞糊涂了,因为他们认为将 1 结果赋给double应该是对编译器的某种暗示。事实上,它不是。

    表达式中的计算/促销是与目标类型完全独立,这只是最后一步。子表达式将根据它们的含量进行评估,而不考虑结果的使用方式,因此所有类型的促销/操作仅取决于操作数的类型。

  • 为什么要进行整数除法?

    即使参数都是整数(例如VB6,IIRC),有几种语言会自动执行浮点除法,因为对初学者来说感觉更直观。这与C / C ++中的情况不同:当参数为整数时,除法是积分的,因为在很多情况下你只是不关心小数,和/或出于性能原因而不使用FPU(背景哲学)在C和C ++中,“你不为你不使用的东西买单”。)

    显然,问题本可以使用单独的运算符进行积分除法(VB,再次使用double),但恕我直言,我们在C ++中有足够的运算符。 :)


  1. Nitpickers的角落:是的,这里实际上是初始化,而不是作业,但我们正在谈论同样的错误观念。
  2. “文字”是源代码中包含的值。

答案 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;