C# 为什么是数学?上限返回双倍?

C# 为什么是数学?上限返回双倍?,c#,.net,ceil,C#,.net,Ceil,在C#中,方法Math.天花返回一个double值。为什么它不返回int double的值范围大于int: 双值类型表示一个 双精度64位数字,带 数值范围从负值到负值 1.79769313486232e308至正1.79769313486232e308,以及正零或负零, 正信心,负信心, 而不是一个数字(NaN) Double符合IEC标准 60559:1989(IEEE 754)标准 二进制浮点运算 该标准规定,double有一个52位尾数,这意味着它可以表示任何长度为52位的整数,而不会损

在C#中,方法
Math.天花
返回一个
double
值。为什么它不返回
int

double
的值范围大于
int

双值类型表示一个 双精度64位数字,带 数值范围从负值到负值 1.79769313486232e308至正1.79769313486232e308,以及正零或负零, 正信心,负信心, 而不是一个数字(NaN)

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

该标准规定,
double
有一个52位尾数,这意味着它可以表示任何长度为52位的整数,而不会损失精度


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

因为
double
可以包含比
int
long
更大的数字。同样的原因,没有从
double
int

的隐式转换。文档中提到了返回值:

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


因此,返回值必须是双精度的,因为NaN、NegativeInfinity和PositiveInfinity是双精度字段。

Math。根据传入的类型,天花
可以返回双精度或十进制。换句话说,方法的输出类型与输入类型匹配(非常合理)

他们本可以添加第三个重载,该重载接受
int
并返回
int
,但这并没有多大意义——函数总是只返回其输入


您似乎认为
Math.Ceiling
的目的是将浮点值转换为整数,但它通常不是这样使用的。

它必须返回double才能完成。任何涉及NaN的数学运算都会返回NaN。因此,如果将NaN传递给天花板()函数,则无法返回NaN,因为Int中没有等效项。同时,如果Double的范围更大,那么对于那些超出范围的整数值,将返回什么?+/-inf返回什么?

除了
Math。天花板
还可以返回
十进制
,它没有
NaN
NegativeInfinity
PositiveInfinity
字段。您混淆了原因和结果。文档中这样说是因为它是以这种方式实现的。如果CLR团队将返回值实现为
int
,那么就不会有关于
NaN
e.t.c.So-1的任何单词,对不起。@Dmitry:但是当传递NaN或无穷大的值时,函数将是未定义的。(这就是为什么在给定小数点时它可以返回小数点,因为它们不能是NaN或无穷大。)@Dmitry:我不确定你是否掌握了这里的要点。天花板(Int)将是无用的。@Joe:哦,我从来没有想过会有
Int
类型的参数,它肯定是无用的。我只是想说明,如果有一个
int
参数,那么返回值应该是
int
,也就是说,如果你使用一些简单的数字计算,你希望得到你传入的数据。
long
的可能副本可能包含比
double
更大的值,因为long是64位。@Kevin:a
long
不能包含比
double
更大的值,除非你也要求不损失精度。如果精度损失是可以接受的,一个
双精度
可以包含更大的值。@Kevin-我假设你投了反对票?如果是这样,那就有点苛刻了。这里还有其他的答案提到了双打可能带来的更大的数字,而你没有投反对票。@Jon:你能详细说明一下吗?double没有完整的64位来保存一个数字,那么它怎么能包含一个更大的值呢?@Kevin:看——double可以保存的最大值大约是1.8*10^308。当然,在这一点上精度不高(“上一个”,较小的值大约小10^297)。那么为什么不返回一个long呢?@KthProg:首先,因为double也可以保存比long大的值。
Math.Ceiling(1e300)
返回多长时间?它没有足够大的值来进行任何舍入(afaik),但我明白你的意思。