C# 为什么math.天花(双a)不直接返回int?

C# 为什么math.天花(双a)不直接返回int?,c#,.net,frameworks,base-class-library,C#,.net,Frameworks,Base Class Library,可能重复: msdn定义此方法:返回大于或等于指定的双精度浮点数的最小整数 但事实上,确实如此 public static double Ceiling ( double a ) 为什么不直接返回int?微软是怎么想的 这是因为adouble的范围(±5.0×10−324到±1.7×10308)远大于int(-2147483648到2147483647)的范围。如果返回类型为int许多可能的输入将失败。例如,可能会强制在上下文中抛出,或者它甚至可能在未检查的上下文中返回错误的结果。这

可能重复:

msdn定义此方法:返回大于或等于指定的双精度浮点数的最小整数

但事实上,确实如此

public static double Ceiling (
    double a
)

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

这是因为a
double
的范围(±5.0×10−324到±1.7×10308)远大于
int
(-2147483648到2147483647)的范围。如果返回类型为
int
许多可能的输入将失败。例如,可能会强制在上下文中抛出,或者它甚至可能在未检查的上下文中返回错误的结果。这是不受欢迎的行为

此方法还可以返回一些特殊值,例如和。这仅在返回类型为双精度时才可能

如果您认为结果将适合int,则可以添加显式强制转换:

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

当然,如果你像那个例子那样进行显式转换,如果值不合适,运行时会抛出一个合适的值(你会得到异常处理)。这真的很愚蠢:Double只能可靠地存储~7-8个有效数字,因此,您无法舍入任何高于
2147483648
@ChrisBurt Brown的值:
double
最多可以容纳2^52的每一半的倍数,这远远大于
Int32
的2^31范围(但小于
Int64
的2^63范围)。请注意,强制转换为
int
将被截断,因此,如果十进制数呈现为1.999998675,则可能会以1结尾
Convert.ToInt32()
将四舍五入。