为啥 cout 的输出 << 7/9*9;是零?

Posted

技术标签:

【中文标题】为啥 cout 的输出 << 7/9*9;是零?【英文标题】:Why is the output of cout << 7/9*9; is zero?为什么 cout 的输出 << 7/9*9;是零? 【发布时间】:2009-10-08 21:10:53 【问题描述】:

为什么下面代码的输出等于0或者servn?

cout << 7/9*9;   //output 0 (zero)   why?

float nine = 9;
float seven = 7;
float i = seven/nine*nine;
cout << i     //output 7   Why?

感谢您的帮助。

【问题讨论】:

你的 sn-p 不能用我的 C 编译器编译,但我猜标签没问题。 几乎等同于:***.com/questions/1205490/… 【参考方案1】:

7/9*9 将这些数字计算为整数,因此 7/9 的计算结果为 0,并且 0*9 = 0。

当你让它们浮动时,你正在执行预期的计算。

尝试 7.0/9*9 得到 7,然后你将进行浮点运算。

【讨论】:

哈哈!超级简单的问题如何变成狙击比赛真是太棒了。不过解释得很好。 我知道 .. 哈哈,当您遇到错误时,付费查看 SO:D 对于世界其他地方(亚洲)的程序员来说太糟糕了,我们无法赶上狙击低悬的问题:-)【参考方案2】:

在 C 中,当你除以整数时,余数会被丢弃。在这里,你正在做 7 / 9,然后取其结果并乘以 9。在步骤中,这是 C 的想法:

7 / 9 = 0
0 * 9 = 0

当您使用浮点数时,它可以正常工作,因为不再丢弃剩余部分。

【讨论】:

严格来说,使用浮点数,仍然有一个被丢弃的剩余部分。 IOW 存在舍入错误。迂腐地,除法是乘法的逆运算,这对于所有整数或所有浮点数都是不可能的。根据定义,近似商 + (余数 * 除数) = 被除数,其中近似商表示除法算法的结果。浮点和定点除法以及整数都有余数 - 尽管几乎没有人关心它的确切值,所以不要指望它有一个运算符。 感谢您提到史蒂夫!小而快的反应往往会错过诸如此类的微妙但重要的细节。【参考方案3】:

在:

cout << 7 / 9 * 9;

你正在做整数运算。所以 7/9 是 0,0*9 是 0。

要使用浮点运算(这是您在第二个示例中使用的),您需要执行以下操作:

cout << 7.0 / 9 * 9;

【讨论】:

【参考方案4】:

7/9*9 等于 (7 / 9) * 9,但由于 79 是整数而不是浮点数,7 / 9 等于 0(除法的商)。

【讨论】:

【参考方案5】:

我认为这是一个精度问题。 / 和 * 运算符的优先级相同,因此 7/9*9 从左到右计算为 (7/9)*9。问题是 (7/9) 在整数算术中为 0。当您将它们显式存储为浮点数时,该 / 操作以浮点数完成,它可以以比 int 更高的精度存储 7/9。

如果您想在没有精度问题的情况下在一行中进行计算,请尝试:

cout

【讨论】:

【参考方案6】:

已经有很多正确答案了。补充说明:如果您想将其保留为整数运算而不使用浮点数,则需要对其进行排序,以便在除法之前进行乘法以获得最大精度(只要在乘法期间不会发生溢出。因此,而不是比(7.0/9)*9 转换为浮点数,你可以做(9*7)/9

【讨论】:

以上是关于为啥 cout 的输出 << 7/9*9;是零?的主要内容,如果未能解决你的问题,请参考以下文章

C++中cout<<字符数组名;为啥能输出字符串?

为啥这个语句会输出?

为啥我的函数没有输出预期的内容[重复]

为啥c++cout语句整数相除保留了五位小数?

c++中的String类,为啥直接用于cout就能输出?它里面包含了啥?

c++中,如果int a;cin>>a;cout<<a; 在输入时输入一个字母c ,为啥输出结果为-858993460,而不是c的码值