如何在 C# 中将 float 转换为 int,以便它输出与 float 相同的值。ToString()?

How to cast float to int in C# so that it outputs the same value as float.ToString()?

提问人:blade 提问时间:5/2/2018 最后编辑:blade 更新时间:11/26/2022 访问量:2592

问:

调用不精确的浮点数会产生人类期望的数字(例如。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"
C# 点浮 点精度

评论

1赞 FindOutIslamNow 5/2/2018
怎么样 ?Math.Ceiling
0赞 Eric Postpischil 5/2/2018
如果浮点数是 4.9375,您想要打印什么,“4”或“5”?或者这永远不会发生,因为浮点数永远不会离整数那么远?它离整数有多远?您希望在什么时候将结果从“5”更改为“4”?
0赞 Eric Postpischil 5/2/2018
@FindOutIslamNow:您认为 OP 希望将略高于 5 的值打印为“6”吗?
0赞 Evk 5/2/2018
我猜你正在寻找(int) Math.Round(num)
1赞 user1672994 5/2/2018
使用 Math.Round --- .Math.Round 函数将浮点值舍入到最接近的整数,并将中点值舍入到最接近的偶数。(int)Math.Round(num)).ToString()

答:

1赞 user1672994 5/2/2018 #1

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());
2赞 apocalypse 5/2/2018 #2

也许你正在寻找这个:

Convert.ToInt32(浮点数)

评论

0赞 blade 5/2/2018
这似乎等同于 ,这不是我要找的。我已经澄清了这个问题。Math.Round()
0赞 blade 5/3/2018 #3

到目前为止,最好的解决方案似乎是问题中的解决方案。

int ToInt(float value) {
    return (int)(value + Math.Sign(value) * 0.000001f);
}

如果差值足够小(小于 ),这将有效地将值捕捉到最接近的 int 值。但是,此函数与 ToString 的行为不同,并且对不精确性的容忍度略高。0.000001

@chux建议的另一种解决方案是使用 ToString 并解析字符串。当数字具有小数点(或逗号)时,使用 Int32.Parse 会引发异常,因此您必须仅保留字符串的整数部分,并且可能会引起其他麻烦,具体取决于您的默认值。CultureInfo