调用ToString()不精确的浮点数会产生人们期望的数字(例如4.999999 ...被打印为5)。但是,当强制转换为int时,小数部分会丢失,结果是一个整数减1。float num = 5f;num *= 0.01f;num *= 100f;num.ToString().Dump(); // produces "5", as expected((int)num).ToString().Dump(); // produces "4"如何将浮点数转换为int,以便获得对人类有益的价值,从而float.ToString()产生这种价值?我正在使用这个肮脏的技巧:int ToInt(float value) { return (int)(value + Math.Sign(value) * 0.00001);}..但肯定必须有一个更优雅的解决方案。
3 回答
慕少森
TA贡献2019条经验 获得超9个赞
0.05f * 100 由于浮点舍入而不是正好为5(实际上是值4.999998 ....以浮点数表示时
答案是,在的情况下(int)(.05f * 100),您将浮点值4.999998截断为一个整数,从而得出4。
所以用Math.Round。Math.Round函数将浮点值四舍五入到最接近的整数,并将中点值四舍五入到最接近的偶数。
float num = 5f;
num *= 0.01f;
num *= 100f;
Console.WriteLine(num.ToString());
Console.WriteLine(((int)Math.Round(num)).ToString());
慕沐林林
TA贡献2016条经验 获得超9个赞
到目前为止,最好的解决方案似乎就是问题所在。
int ToInt(float value) {
return (int)(value + Math.Sign(value) * 0.000001f);
}
如果差异足够小(小于0.000001),则可以有效地将值捕捉到最接近的int 。但是,此函数与ToString的行为不同,并且对不精确性的容忍度更高。
建议的另一种解决方案是使用ToString并将字符串解析回去。当数字具有小数点(或逗号)时,使用Int32.Parse会引发异常,因此您仅需保留字符串的整数部分,这可能会导致其他麻烦,具体取决于您的default CultureInfo。
- 3 回答
- 0 关注
- 271 浏览
添加回答
举报
0/150
提交
取消