如何将双精度数转换为最近的整数值?

176

如何将 double 转换为最近的整数?

8个回答

309
double d = 1.234;
int i = Convert.ToInt32(d);

参考

处理舍入如下:

四舍五入为最接近的32位有符号整数。如果值正好在两个整数中间,返回偶数;也就是说,4.5 转换为 4,5.5 转换为 6。


11
使用它返回所需的整数,因此比Math.Round更好。 - Keith
11
@robert-koritnik,不确定为什么会显示“无效”。原帖未指定任何首选四舍五入规则,“四舍五入到最近的偶数”是早期的标准规则。始终向上舍入会产生不必要的统计影响。 - Keith
3
"始终向上取整会产生不必要的统计影响"--这完全是错误的。向上取整.5将准确一半的数字--[0,.5)--向下取整,另一半数字--[.5,1)--向上取整。即使稍微偏向偶数也会造成偏差,因为它将(.5,1.5)四舍五入到1,但将[1.5、2.5]四舍五入到2。 - Jim Balter
Convert.ToInt64(val * 100) 的速度比 Math.Round(val, 2, MidpointRounding.AwayFromZero) * 100 快约33%。 - Nick
12
由于零不需要四舍五入,所以四舍五入向上会引入正偏差,因此被称为非对称舍入。如果您的分布足够均匀且舍入不会偏向偶数或奇数数字,则“四舍五入到最近偶数”方法不会引入偏差。请参阅「half-way rounding tie-breaking」。 - sdds
显示剩余3条评论

92

使用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

7
Convert.ToInt32()会执行相同的操作吗?还是只是简单地截去小数点后面的所有内容? - The Muffin Man
247
实际上不会产生一个整数,而是产生一个双精度浮点数。 - gatopeich
13
@Ronnie - 不是错误,这是有意设计的。默认情况下,Math.Round会将中间数(x + .5)四舍五入到最接近的偶数。如果您想要不同的行为,必须通过标志指定。http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx - nickf
4
如果您需要一个整数,请使用 Convert.ToInt16(NumberToConvert);。可以将16替换为3264 - Cullub
6
Double不等于Int。 - Evgeni Nabokov
显示剩余4条评论

40

你也可以使用以下函数:

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

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


这对我来说非常完美,因为Math.Round并不按照我想要的方式工作。 - Hanna
@cullub 是的,它可以将带有0.5附加的双精度数转换为整数。 - Darrell
这是我首选的方法 - 以非常简单的方式运作。比Math.Round(d, MidpointRounding.AwayFromZero) 更简短,更易读,并且比使用if语句选择是取整还是进一步取整更为简洁。而且,在结尾处实际上返回一个整数,而不是一个双精度数。 - binderbound
3
请见@Eternal21下面的评论,针对负数的奇怪行为(MyRound(-1.2)=0)。 - Chris
2
对于任何想知道的人,@Chris提到的问题现在可能已经通过检查值是否为负来解决了。 - John Weisz
这对我来说比Convert.ToInt32()更好用,因为我没有处理货币。我希望它无论是偶数还是奇数都能保持一致的舍入方式。 - goku_da_master

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

5
我知道这个问题很老了,但我在寻找答案时碰巧遇到了它。我想分享一个非常有用的提示。
当转换为整数时,只需在将值向下转换之前添加 0.5 即可。由于向下转换为 int 始终将数字减小到较低的数字(例如(int)1.7 == 1 ),因此如果您的数字为 0.5 或更高,则添加 0.5 将使其上升到下一个数字,您对 int 的向下转换应返回正确的值。(例如(int)(1.8 +0.5)== 2 )

14
问题在于如果你尝试以这种方式转换负值。例如,-1.25最终将等于0。(-1.25 + 0.5 = 0.75,一旦转换为整数,它就是0)。因此,您需要从负值中减去0.5。 - Eternal21
1
可以使用 + 0.5 * Math.Abs(d) - TaW

0

对于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); }

Q没有提及或标记Unity。 - CosmicGiant
@XenoRo 我正在回答这个旧问题,为那些在使用Unity时寻找类似答案的人提供帮助。 - zwcloud
4
您可以回答自己的问题以进行知识共享。在这种情况下,请创建一个针对 API(在这种情况下是 Unity)的单独问题。答案应该适用于问题。否则,可能会为每个具有舍入函数的 C# API 提供一个答案。 - CosmicGiant

0

-1

我正在开发一个带有Int按钮的科学计算器。我发现以下是一个简单且可靠的解决方案:

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

Math.Round有时会产生意外或不良结果,而显式转换为整数(通过强制转换或Convert.ToInt...)通常会对高精度数字产生错误的值。上述方法似乎总是有效。


3
这是否会把所有负数四舍五入为最接近的较小整数,而将所有正数四舍五入为最接近的较大整数?这未必是“最接近”的整数。 - Tim Pohlmann
这不是最接近的数字。 - Samer Aamar
2
给定1.99,这将返回1.0。 - Jon Schneider
“Ceiling”是我们需要将正数向上舍入的函数。太好了!已点赞。 - Todd Main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接