如何在C#中将float转换为int,使其输出与float.ToString()相同的值?

调用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);

}

..但肯定必须有一个更优雅的解决方案。


吃鸡游戏
浏览 272回答 3
3回答

素胚勾勒不出你

也许您正在寻找:Convert.ToInt32(float)来源

慕少森

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());

慕沐林林

到目前为止,最好的解决方案似乎就是问题所在。int ToInt(float value) {    return (int)(value + Math.Sign(value) * 0.000001f);}如果差异足够小(小于0.000001),则可以有效地将值捕捉到最接近的int 。但是,此函数与ToString的行为不同,并且对不精确性的容忍度更高。建议的另一种解决方案是使用ToString并将字符串解析回去。当数字具有小数点(或逗号)时,使用Int32.Parse会引发异常,因此您仅需保留字符串的整数部分,这可能会导致其他麻烦,具体取决于您的default CultureInfo。
打开App,查看更多内容
随时随地看视频慕课网APP