C++中的除法操作未按预期工作

38
我本来在做其他事情,但所有的输出都是0,所以我做了这个极简示例,但输出仍然是0。
#include <iostream>

int main(int argc, char** argv)
{
  double f=3/5;
  std::cout << f;
  return 0;
}

我错过了什么?

6个回答

58
你忽略了3和5是整数,所以你得到的是整数除法。为了让编译器执行浮点数除法,请将其中一个变成实数:
 double f = 3.0 / 5;

17

它并不必须.0,你也可以使用3./53/5.3e+0 / 53 / 5e-00xCp-2 / 5等方式进行浮点数除法运算。只需要使用指示器告诉编译器应该按照浮点数进行计算即可。

另一种可能性是:double f=double(3)/5。这样做需要输入更多内容,但没有任何疑问会发生什么。

或者简单地使用double f=.6,这也能达到相同的效果...


9

试一下这个:

double f = 3.0/5.0;

这应该可以解决你的问题。

5
尝试在除数中加入.0,这将把它们转换为浮点型字面量。

2

如果你使用int保存了通用变量,并且想要将比率作为double获得:

最初的回答:

using namespace std;
int main()
{
   int x = 7;
   int y = 4;
   double ratio;
   ratio = static_cast<double>(x)/static_cast<double>(y);
   cout << "ratio =\t"<<ratio<< endl;
}

2

您正在使用整数。如果您想让常量成为double型,可以像leftaroundabout状态一样做很多事情,但那样并不好懂。它难以阅读并且令人困惑。如果您想要3和5,将它们变成3.0和5.0即可。如果他们被迫阅读您的代码,每个人都会知道您的意思。他/她所说的大部分内容实际上需要您了解C/C++以及floats的存储方式才能弄清楚。


我认为0xCp-2 / 5不应该被认真对待,这很明显!但是关于使用3.0:这是一种品味问题。我个人讨厌以这种方式编写代码,因为在科学中,小数点后有限的数字暗示了测量值的某种不准确性等等。所以当我看到3.0时,我总是想到3±.05,而3.0/5.0对我来说是.6±.01。这不是双精度!我更喜欢使用3./5 - leftaroundabout
我发帖的目的是为了让它更易读。3/5看起来并不像标准的数学方程式。你需要了解你的受众:我认为如果发帖者(如果他们在处理实数和整数的差异时遇到问题)不是为高级科学应用程序编程,那么越简单越好。 - Joe Tyman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接