39

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

4

3 回答 3

36

double范围为 ±5.0 × 10 -324至 ±1.7 × 10 308long范围为 –9,223,372,036,854,775,808 至 9,223,372,036,854,775,807。不幸的是,并非所有整数浮点值都可以用整数表示。

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

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

虽然单参数重载确实Math.Round(double)Math.Round(decimal)返回整数值,但这些重载仍然不能返回整数值类型。

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

于 2013-02-08T05:24:08.033 回答
13

考虑到函数的结果总是一个整数,

不,不会的。您甚至可以使用Math.Round 方法 (Double, Int32)指定位数

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

于 2013-02-08T05:24:26.843 回答
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 无法容纳它。

于 2013-02-08T05:25:16.327 回答