为什么Math.Round不返回int?

时间:2013-02-08 05:16:04

标签: c# math

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

3 个答案:

答案 0 :(得分: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)总是返回一个整数值,但这些重载仍然不能返回整数值类型。

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

答案 1 :(得分:13)

  

考虑到函数的结果将始终是整数,

不,不会。您甚至可以使用Math.Round Method (Double, Int32)

指定位数
  

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

答案 2 :(得分:2)

这样做的目的是包括大于int范围内的数字。 因此,Math.Floor将返回一个double,可以根据大小和开发人员将其转换为int或long。 如果你在int范围之外尝试过Math.Floor,那么如果Math.Floor返回一个int,它就会失败,但它没有,它会返回一个你可以强制转换为long的double。

     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无法容纳它。