C#中整数运算时乘以1.0与不乘1.0为何结果不同?
为什么C#里乘以1.0和不乘结果差这么大?
嘿,这个问题其实是C#里整数除法的特性在搞怪,我来给你把这个坑讲明白!
先看你代码里的关键部分:当你去掉*1.0的时候,计算式是countLight / count * 100——这里countLight和count都是int类型的整数,C#里整数之间做除法会执行整数除法,也就是直接舍去小数部分,只保留商的整数部分。
拿你代码里的数值举例:countLight=2,count=5,那2/5的整数除法结果是0,再乘以100还是0,最后格式化输出就是0.00%,这就是为什么所有结果都变成0的原因。
那加上*1.0之后呢?1.0是double类型的浮点数,当你用整数countLight乘以1.0时,C#会自动把整数转换成double类型,这时候整个除法运算就变成了浮点数除法,会完整保留小数部分。还是用你的例子:2*1.0=2.0(double类型),再除以5(此时5也会被自动转成double)得到0.4,乘以100就是40.0,格式化后就是40.00%,这就和你纸上计算的结果一致了。
其实除了乘以1.0,还有其他方式能达到同样的效果,比如把其中一个整数强制转换成浮点数:
double percentLight = (double)countLight / count * 100;
这样也能触发浮点数除法,得到正确的百分比。
总结一下:整数除法只留整数商,浮点数除法会保留小数;*1.0的作用就是把整数运算转换成浮点数运算,避免了整数除法的截断问题。
内容的提问来源于stack exchange,提问作者Martin Kulev
相关产品推荐
相关产品推荐

