为啥 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
,但由于 7
和 9
是整数而不是浮点数,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++中的String类,为啥直接用于cout就能输出?它里面包含了啥?
c++中,如果int a;cin>>a;cout<<a; 在输入时输入一个字母c ,为啥输出结果为-858993460,而不是c的码值