2013-02-08 39 views
32

在C#中,为什么不舍去数学函数Floor,Ceiling和Round返回一个int?考虑到函数的结果总是一个整数,为什么它会返回一个float,doubledecimal为什么Math.Round不返回int?

+1

Round重载,并且返回类型必须匹配初始者; p – leppie

+11

想象一下,您调用'Math.Round(1E30)'并返回一个int,会发生什么? –

+0

所以你说这是BCL的工作来确定你想要的结果是什么? –

回答

31

double has the range of ±5.0 × 10−324 to ±1.7 × 10308long has the range of –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807。不幸的是不是所有积分浮点值可以用整数表示。

例如,1e19已经超出了64位有符号整数的范围。

(long)Math.Round(1e19) == -9223372036854775808L // WTF? 

虽然这是事实,该单参数超载Math.Round(double)Math.Round(decimal)总是会返回一个整数值,这些重载仍不能返回一个整数值类型。

如果你知道传递给函数的值将返回一个可以用整型值类型表示的值,你可以自己强制转换。图书馆不会这样做,因为它需要考虑一般情况。

+3

但是,请注意,有很长的整数* *不能表示为双精度:'(double)100000000000000001L == 1e17'(和'1e17 == 1e17 + 1')。 –

+0

@ AntalS-Z是的。对于更大的先例,使用['decimal'](http://msdn.microsoft.com/zh-cn/library/364x0z75(v = vs80).aspx)类型更好。 –

13

考虑到函数的结果将永远是一个整数,

没有也不会是。你甚至可以指定的位数与Math.Round Method (Double, Int32)

数字类型:
System.Int32
的返回值小数位数。

+2

+1事实上,由于不是所有时间我们需要舍入到int – V4Vendetta

+0

我不禁要在这里愚蠢,圆的文档说“返回最接近的整数” - 你说它并不总是返回一个整数。这似乎没有道理。 – PandaWood

+0

@PandaWood,你在哪里看到“返回最接近的整数”?我找不到它,请分享链接。如果你指的是这个“最接近的整数”。如果a的小数部分在两个整数之间,其中一个是偶数,另一个是奇数,则返回偶数。请注意,此方法返回一个Double而不是一个整型。然后注意最后一部分。 – Habib

2

这样做的目的是包含大于int范围内包含的数字。 因此,Math.Floor将返回一个可以根据大小和开发人员转换为int或long的double。 如果您尝试Math.Floor在int范围之外,如果Math.Floor返回一个int值,但它不会返回一个double值,您可以将其转换为long值。

 double d = 4147483647.5678; 
    long a = (long)Math.Floor(d); 
    int b = (int)Math.Floor(d); 
    Console.WriteLine(a); 
    Console.WriteLine(b); 

请注意,在转换为int时,b被推回到MIN int,因为int不能适应它。

相关问题