在C#中,方法
Math.Ceiling
返回一个double
值。为什么它不返回int
?double
的取值范围比 int
更大:
Double 值类型是一个双精度 64 位数,取值范围为负 1.79769313486232e308 到正 1.79769313486232e308,还包括正数或负数的零、正无穷和负无穷以及非数字(NaN)。
Double 符合 IEC 60559:1989 (IEEE 754) 标准的二进制浮点算术。
该标准指出,double
具有 52 位尾数,这意味着它可以表示任何长度不超过 52 位的整数而不会失去精度。
因此,如果输入足够大,则输出不适合在 int
中存储(int
只有 32 位)。
文档说明了返回值:
a 的最小整数,大于等于 a。如果 a 等于 NaN、NegativeInfinity 或 PositiveInfinity,则返回该值。
因此,返回值必须为 double 类型,因为 NaN、NegativeInfinity 和 PositiveInfinity 都是 Double 类型的字段。
Math.Ceiling
可能返回一个没有 NaN
、NegativeInfinity
或 PositiveInfinity
字段的 decimal
类型。 - MusiGenesisInt
,那么参数也应该是 Int
,因为你自然会期望相同类型的返回值(当然,在上下文中提到的情况下,因为如果方法名类似于 ToInt()
,则期望的返回值应该是 int
)。 - Dmitrii Lobanovint
类型的参数,那肯定是没用的。我只是试图说明一下,如果有一个int
参数,那么期望的返回值应该是一个int
,也就是说,如果你在数字上进行一些简单的计算,你期望得到的结果应该和你传入的参数相同。 - Dmitrii LobanovMath.Ceiling
可以返回double
或decimal
,具体取决于传入的类型。换句话说,该方法的输出类型与输入类型匹配(非常合理)。int
并返回一个int
,但这样做没有太大意义 - 函数总是会返回其输入。Math.Ceiling
的目的是将浮点数强制转换为整数,但通常情况下它不是这样使用的。为了完整起见,它必须返回双倍。涉及NaN的任何数学运算始终返回NaN。因此,如果将NaN传递给ceiling()函数,则无法返回NaN,因为Int中没有等效项。另外,考虑到Double具有更广泛的范围,那么对于那些超出范围的整数值会返回什么?对于+/- inf,应该返回什么?
因为double
可以包含比int
或long
更大的数字。同样的原因,从double
到int
没有隐式转换。
long
可以包含比 double
更大的值,因为 long
是 64 位。 - Kevinlong
不能包含比double
更大的值。如果可以接受精度损失,则double
可以包含远大于long
的值。 - Jondouble
类型可以容纳的最大值约为1.8 * 10^308。当然,在那个点上精度已经非常低了(比它“前一个”更小的值约小10^297)。 - Jon
Math.Ceiling(1e300)
会返回什么长整型值? - Jon