如何将一个 double 转换为最接近的整数值?

如何将一个双精度数转换为最接近的整数?

194317 次浏览

使用 Math.round(),可能与 MidpointRounding.AwayFromZero结合使用

例如:

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3
double d = 1.234;
int i = Convert.ToInt32(d);

参考文献

四舍五入的方法是这样的:

四舍五入到最接近的32位有符号整数。如果值为 在两个整数之间,返回偶数,即4.5 转换为4,5.5转换为6。

double d;
int rounded = (int)Math.Round(d);

我正在开发一个带有国际按钮的计算器,我发现以下是一个简单可靠的解决方案:

double dblInteger;
if( dblNumber < 0 )
dblInteger = Math.Ceiling(dblNumber);
else
dblInteger = Math.Floor(dblNumber);

数学。Round 有时会产生意想不到的或不想要的结果,并且显式地转换为整数(通过 cast 或 Convert.ToInt...)通常会为更高精度的数字产生错误的值。上述方法似乎总是奏效。

你也可以使用函数:

//Works with negative numbers now
static int MyRound(double d) {
if (d < 0) {
return (int)(d - 0.5);
}
return (int)(d + 0.5);
}

根据架构的不同,它的速度要快几倍。

我知道这个问题很古老,但是我在寻找类似问题的答案时发现了它。我想我应该分享一下我得到的非常有用的建议。

在转换为 int 时,只需在向下转换之前将 .5添加到您的值中。如果你的数字是 .5或者更高,加上 .5会把它带到下一个数字,你向下转到 int会返回正确的值。(例如 (int)(1.8 + .5) == 2)

对于 Unity,使用 Mathf RoundToInt

using UnityEngine;


public class ExampleScript : MonoBehaviour
{
void Start()
{
// Prints 10
Debug.Log(Mathf.RoundToInt(10.0f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.2f));
// Prints 11
Debug.Log(Mathf.RoundToInt(10.7f));
// Prints 10
Debug.Log(Mathf.RoundToInt(10.5f));
// Prints 12
Debug.Log(Mathf.RoundToInt(11.5f));


// Prints -10
Debug.Log(Mathf.RoundToInt(-10.0f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.2f));
// Prints -11
Debug.Log(Mathf.RoundToInt(-10.7f));
// Prints -10
Debug.Log(Mathf.RoundToInt(-10.5f));
// Prints -12
Debug.Log(Mathf.RoundToInt(-11.5f));
}
}

来源

public static int RoundToInt(float f) { return (int)Math.Round(f); }

如果浮点值超出 Int 范围,则其他答案中的方法将引发 OverflowException

int result = 0;
try {
result = Convert.ToInt32(value);
}
catch (OverflowException) {
if (value > 0) result = int.MaxValue;
else result = int.Minvalue;
}