提问人:blade 提问时间:5/2/2018 最后编辑:blade 更新时间:11/26/2022 访问量:2592
如何在 C# 中将 float 转换为 int,以便它输出与 float 相同的值。ToString()?
How to cast float to int in C# so that it outputs the same value as float.ToString()?
问:
调用不精确的浮点数会产生人类期望的数字(例如。4.999999...打印为 )。但是,当转换为 int 时,小数部分被删除,结果是减去 1 的整数。ToString()
5
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);
}
..但肯定有一个更优雅的解决方案。
编辑:我很清楚浮点数被截断的原因(4.999 到 4 等)问题在于在模拟 System.Single.ToString() 的默认行为时强制转换为int
为了更好地说明我正在寻找的行为:
-4.99F 应铸造为 -4 4.01F 应铸造为 4 4.99F 应铸造为 4 4.999999F 应铸造为 4
4.9999993F 应铸造为 5
这与产生的行为完全相同。ToString
尝试运行以下命令:
float almost5 = 4.9999993f;
Console.WriteLine(almost5); // "5"
Console.WriteLine((int)almost5); // "4"
答:
0.05f * 100
由于浮点四舍五入,它不完全是 5(当表示为浮点数时,它实际上是值 4.999998...)
答案是,在 的情况下,您将浮点值 4.999998 截断为整数,从而得到 。(int)(.05f * 100)
4
所以使用 .Math.Round 函数将浮点值舍入到最接近的整数,并将中点值舍入到最接近的偶数。Math.Round
float num = 5f;
num *= 0.01f;
num *= 100f;
Console.WriteLine(num.ToString());
Console.WriteLine(((int)Math.Round(num)).ToString());
也许你正在寻找这个:
评论
Math.Round()
到目前为止,最好的解决方案似乎是问题中的解决方案。
int ToInt(float value) {
return (int)(value + Math.Sign(value) * 0.000001f);
}
如果差值足够小(小于 ),这将有效地将值捕捉到最接近的 int 值。但是,此函数与 ToString 的行为不同,并且对不精确性的容忍度略高。0.000001
@chux建议的另一种解决方案是使用 ToString 并解析字符串。当数字具有小数点(或逗号)时,使用 Int32.Parse 会引发异常,因此您必须仅保留字符串的整数部分,并且可能会引起其他麻烦,具体取决于您的默认值。CultureInfo
评论
Math.Ceiling
(int) Math.Round(num)
(int)Math.Round(num)).ToString()