为什么Math.Ceiling返回double类型?

52
在C#中,方法Math.Ceiling返回一个double值。为什么它不返回int
5个回答

33

double 的取值范围比 int 更大:

Double 值类型是一个双精度 64 位数,取值范围为负 1.79769313486232e308 到正 1.79769313486232e308,还包括正数或负数的零、正无穷和负无穷以及非数字(NaN)。

Double 符合 IEC 60559:1989 (IEEE 754) 标准的二进制浮点算术。

该标准指出,double 具有 52 位尾数,这意味着它可以表示任何长度不超过 52 位的整数而不会失去精度。

因此,如果输入足够大,则输出不适合在 int 中存储(int 只有 32 位)。


5
为什么不返回一个长整型呢? - KthProg
1
@KthProg:首先,因为双精度浮点数也可以存储比长整型更大的值。Math.Ceiling(1e300)会返回什么长整型值? - Jon
据我所知,它不具备足够精度来保留那么大的值以进行任何舍入,但我理解你的意思。 - KthProg

31

文档说明了返回值:

a 的最小整数,大于等于 a。如果 a 等于 NaN、NegativeInfinity 或 PositiveInfinity,则返回该值。

因此,返回值必须为 double 类型,因为 NaN、NegativeInfinity 和 PositiveInfinity 都是 Double 类型的字段。


7
除了 Math.Ceiling 可能返回一个没有 NaNNegativeInfinityPositiveInfinity 字段的 decimal 类型。 - MusiGenesis
11
你把因果关系搞混了。文档之所以这样写,是因为它是按照这种方式实施的。如果CLR团队将返回值实现为“int”,那么就不会有任何关于“NaN”等的言论了。所以,很抱歉,我无法为你提供帮助。 - Dmitrii Lobanov
3
@Dmitry: 但是如果传入 NaN 或无穷大的值,该函数将未定义。这就是为什么当给定十进制小数时它可以返回小数,因为小数不能为 NaN 或无穷大。 - user79758
@Joe:我认为如果返回值是 Int,那么参数也应该是 Int,因为你自然会期望相同类型的返回值(当然,在上下文中提到的情况下,因为如果方法名类似于 ToInt(),则期望的返回值应该是 int)。 - Dmitrii Lobanov
2
@Dmitry:我不确定你是否理解了这里的重点。Ceiling(Int)将是无用的。 - user79758
2
@Joe:哦,我并不指望会有int类型的参数,那肯定是没用的。我只是试图说明一下,如果有一个int参数,那么期望的返回值应该是一个int,也就是说,如果你在数字上进行一些简单的计算,你期望得到的结果应该和你传入的参数相同。 - Dmitrii Lobanov

6
Math.Ceiling可以返回doubledecimal,具体取决于传入的类型。换句话说,该方法的输出类型与输入类型匹配(非常合理)。
他们本可以添加第三个重载,接受一个int并返回一个int,但这样做没有太大意义 - 函数总是会返回其输入。
你似乎认为Math.Ceiling的目的是将浮点数强制转换为整数,但通常情况下它不是这样使用的。

3

为了完整起见,它必须返回双倍。涉及NaN的任何数学运算始终返回NaN。因此,如果将NaN传递给ceiling()函数,则无法返回NaN,因为Int中没有等效项。另外,考虑到Double具有更广泛的范围,那么对于那些超出范围的整数值会返回什么?对于+/- inf,应该返回什么?


0

因为double可以包含比intlong更大的数字。同样的原因,从doubleint没有隐式转换。


1
实际上,long 可以包含比 double 更大的值,因为 long 是 64 位。 - Kevin
1
@Kevin:除非您还要求不损失精度,否则long不能包含比double更大的值。如果可以接受精度损失,则double可以包含远大于long的值。 - Jon
@Kevin - 我猜测你给了负评?如果是的话,那有点过分了。这里还有其他回答提到了使用双精度可以得到更大的数字,而你并没有对它们进行负评。 - Andrew Cooper
@Jon:你能详细解释一下吗?一个 double 型变量只有 64 位,怎么可能存储更大的数值呢? - Kevin
1
@Kevin:请参考http://en.wikipedia.org/wiki/Binary64 -- double类型可以容纳的最大值约为1.8 * 10^308。当然,在那个点上精度已经非常低了(比它“前一个”更小的值约小10^297)。 - Jon

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