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

How might I convert a double to the nearest integer value?

提问人:leora 提问时间:3/11/2009 最后编辑:Jon Schneiderleora 更新时间:11/17/2019 访问量:207421

问:

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

C# 舍入

评论


答:

92赞 nickf 3/11/2009 #1

使用 ,可能与 结合使用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赞 The Muffin Man 5/25/2011
不会做同样的事情,还是简单地剥离小数点后的所有内容?Convert.ToInt32()
247赞 gatopeich 2/2/2012
实际上不产生整数,而是产生双精度。
13赞 nickf 9/24/2012
@Ronnie - 不,这是设计使然。默认情况下,Math.Round 会将中点数字 (x + .5) 四舍五入到最接近的偶数。如果你想要一个不同的行为,你必须通过一个标志来指定它。msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
4赞 Cullub 8/20/2014
如果需要整数,请使用 可以替换为 或 。Convert.ToInt16(NumberToConvert);163264
6赞 Evgeni Nabokov 8/24/2018
Double 不是 Int。
309赞 John Sheehan 3/11/2009 #2
double d = 1.234;
int i = Convert.ToInt32(d);

参考

按如下方式处理舍入:

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

评论

11赞 Keith 7/29/2011
这要好得多,因为它会根据需要返回一个 int。Math.Round
11赞 Keith 11/18/2011
@robert-koritnik.不知道为什么这是“无效的”。OP 没有指定首选的舍入规则,“将 .5 四舍五入到最接近的偶数”是很久以前的标准规则。总是四舍五入会产生不必要的统计效果。
0赞 Robert Koritnik 11/18/2011
@Keith:我不知道,但我一直被教导要四舍五入 x.5,但我可以看到向上或向下进行统计的推理。谢谢你。PS 很明显,我不在统计学、财务或会计领域,这种四舍五入似乎是默认的。
3赞 Jim Balter 9/17/2013
“总是四舍五入会产生不必要的统计效果”——这完全是错误的。向上舍入 .5 正好将一半的数字-- --向下舍入,正好一半的数字-- --向上。四舍五入到偶数会稍微偏向偶数,因为它会四舍五入到 1 但四舍五入到 2。[0,.5)[.5,1)(.5,1.5)[1.5,2.5]
12赞 sdds 9/24/2014
@JimBalter 由于零不是四舍五入的,四舍五入一半确实会引入正偏差,因此称为不对称四舍五入。如果分布足够均匀,并且四舍五入不会偏向偶数或偶数,则“四舍五入到偶数”则不会。请参阅中途四舍五入的平局
16赞 Shea 3/11/2009 #3
double d;
int rounded = (int)Math.Round(d);
-1赞 Mark Jones 4/12/2011 #4

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

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

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

评论

3赞 Tim Pohlmann 7/6/2015
这难道不是四舍五入所有负数并四舍五入所有正数吗?这不一定是“最整洁”的整数。
0赞 Samer Aamar 5/17/2017
这不是最接近的数字。
2赞 Jon Schneider 10/21/2017
给定 1.99,则返回 1.0。
0赞 Todd Main 3/3/2023
Ceiling是我们需要四舍五入的正数。完善!点赞。
40赞 szymcio 11/10/2011 #5

您还可以使用函数:

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

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

评论

0赞 Hanna 4/29/2012
这对我来说是完美的,因为 Math.Round 没有按照我想要的方式工作。
0赞 Darrell 9/23/2014
@cullub是的,确实如此。它将附加了 0.5 的双倍 d 转换为整数。
0赞 binderbound 1/19/2015
这是我的首选方法 - 以一种非常简单的方式工作。比 Math.Round(d, MidpointRounding.AwayFromZero) 更短、更易于阅读,并且比使用 if 语句选择是向下舍入还是向上舍入更简洁。AND,实际上在末尾返回一个整数,而不是双精度
3赞 Chris 7/1/2015
请参阅下面的 @Eternal21 的评论,了解负数的奇怪行为 (MyRound(-1.2)=0)
0赞 goku_da_master 5/23/2022
这对我来说比 Convert.ToInt32() 更好,因为我不与钱打交道。我希望它始终如一地以相同的方式四舍五入,无论偶数/奇数如何。
5赞 Trent 4/9/2014 #6

我知道这个问题很老,但我在寻找类似问题的答案时遇到了它。我想我会分享我得到的非常有用的提示。

转换为 int 时,只需在向下转换之前添加您的值即可。由于 downcast to 总是下降到较低的数字(例如),如果您的数字是或更高,则相加会将其调高到下一个数字,并且您的下沉到 应该返回正确的值。(例如.5int(int)1.7 == 1.5.5int(int)(1.8 + .5) == 2)

评论

14赞 Eternal21 11/19/2014
问题是,如果您尝试以这种方式转换负值。例如,-1.25 最终将等于 0。(-1.25 + 0.5 = 0.75,一旦转换为 int,它就是 0)。因此,您需要从负值中减去 0.5。
1赞 TaW 2/12/2019
一个可以使用+ 0.5 * Math.Abs(d)
0赞 zwcloud #7

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

评论

0赞 CosmicGiant 7/31/2019
Q 未提及或标记 Unity。
0赞 zwcloud 7/31/2019
@XenoRo,我正在为那些在使用Unity时寻找类似答案的人回答这个老问题。
4赞 CosmicGiant 8/2/2019
您可以回答自己的问题以进行知识共享。在这种情况下,创建一个特定于 API(在本例中为 Unity)的单独问题。答案应与问题相适应。否则,对于每个具有舍入函数的 C# API,这里都可能有一个答案。
0赞 Gru 11/17/2019 #8

如果浮点值超出 Int 范围,则其他答案中的方法将引发。https://learn.microsoft.com/en-us/dotnet/api/system.convert.toint32?view=netframework-4.8#System_Convert_ToInt32_System_Single_OverflowException

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