【发布时间】:2010-07-19 09:59:20
【问题描述】:
是
(int)(int1 / (float)var2.Count() * 100)
相当于
(int)((int1 / (float)var2.Count()) * 100)
...它会使用浮点除法还是整数除法?
编辑...如果上面的答案是肯定的,那么在这里执行浮点除法有什么好处?
【问题讨论】:
是
(int)(int1 / (float)var2.Count() * 100)
相当于
(int)((int1 / (float)var2.Count()) * 100)
...它会使用浮点除法还是整数除法?
编辑...如果上面的答案是肯定的,那么在这里执行浮点除法有什么好处?
【问题讨论】:
/ 和 * 在 §7.2.1 下具有相同的运算符优先级,因此两个结果应该相同(使用 float 规则)。
然而,我懒得去学习优先表;我只是使用括号。然后它可以在任何语言中工作,而无需记住它。
另一个重要的问题是最终(int) 演员表中的四舍五入:您认为是“向上”、“向下”还是“银行家”?
【讨论】:
1/3(使用整数)是0; 0*100 是 0,这不是预期的答案。 1/(float)3 是 0.33 等,在乘法和强制转换之后给出 33 - 我假设这是一个 %?实际上,我会使用decimal。
记住优先级规则真的很烦人,所以我也更喜欢使用方括号来消除歧义。我尝试遵循“首先为人编写代码,其次是计算机”的建议。但是,有一个有趣的助记符(我从 Bruce Eckel 的书中学到的)来记住(一些)规则:“溃疡瘾君子真的很喜欢 C 很多”:
Ulcer - Unary (+, -, ++, --, !)
Addicts - Arithmetic (and shift) (+, -, *, /, %, <<, >>)
Really - Relational (<, >, ==, <=, >=, !=)
Like - Logical (and bitwise) (&&, ||, &, |, ^)
C - Conditional ( ? : ) <- this is the conditional ternary operator
A lot - Assignment ( =, *=, +=, ...)
这并不完美,按位运算符被挤进去了,我们必须知道乘法运算符(*、/、%)优先于加法运算符(+、-)。
【讨论】:
它们是等价的,它将使用浮点除法。即使先进行乘法运算,也会使用浮点除法,因为 int 除以 float*int 的结果,即 float。
编辑:
如果上面的答案是肯定的,那么在这里执行浮点除法有什么好处?
这是优势吗?您应该考虑的第一件事是它是否正确,因为结果会有所不同。从代码来看,您似乎正在尝试计算某个百分比。使用整数除法时,如果 "int1" 始终小于 var2.Count(),则结果将始终为 0,这可能不是您想要的。
【讨论】:
我会说是的,除法和乘法应该从左到右。因此它是一个浮点除法。
PS:尽可能将float 替换为double。
【讨论】:
请参阅 C# 语言规范:Operator precedence and associativity。
都是一样的。两者都将使用浮点除法。
【讨论】:
是的,两者都是等价的。
两者都将使用浮点除法。
【讨论】:
整数除法只会返回答案的全部部分,即 3/2 将为 1,而浮点除法将为您返回 1.5
【讨论】: