为什么 math.Ceiling (double a) 不直接返回 int?

23

可能重复:
为什么Math.Round/Floor/Ceiling不返回long或int?

这个方法在msdn上被定义为:返回大于或等于指定的双精度浮点数的最小整数

但事实上它是

public static double Ceiling (
    double a
)

为什么不直接返回整数?微软是怎么想的?

1个回答

50

这是因为 double 的范围(±5.0 × 10−324 to ±1.7 × 10308)比 int 的范围(-2,147,483,648 到 2,147,483,647)大得多。如果返回类型为 int,则许多可能的输入将失败。例如,Math.Ceiling 可能会在checked 上下文中强制抛出一个 OverflowException,或者在未经检查的上下文中甚至可能返回一个不正确的结果。这种行为是不可取的。

此外,一些特殊值(如 NaNPositiveInfinity)只有当返回类型为 double 时才能返回。

如果您确信结果适合 int,则可以添加显式转换:

int result = (int)Math.Ceiling(a);

当然,如果您像示例那样进行显式转换,如果值不适合,运行时将会抛出异常(并且您需要处理该异常)。 - user
这真的很傻:双精度浮点数只能可靠地存储约7-8个有效数字,因此您将无法将任何东西舍入到比“2147483648”更高的数字。 - Chris Burt-Brown
1
@ChrisBurt-Brown:一个double可以容纳每个一半的倍数,最大可达2^52,比Int32的2^31范围要大得多(但比Int64的2^63范围要小)。 - supercat
1
请注意,将数据类型转换为 int 会截断小数部分,因此如果你的十进制数被渲染为 1.9999998675,你最终可能得到的结果是 1。而 Convert.ToInt32() 方法则会四舍五入。 - IronSean
@IronSean 哇,所以.Cieling 函数几乎保证返回一个略微偏离整数的值,因为它返回一个双精度浮点数。所以我看到的每个(int)强制转换都有50%的可能性返回不正确的值? - AaronLS

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