为什么C#中的Math.Floor()返回Double而不是Int?

18

可能是重复问题:
为什么Math.Floor(Double)返回Double类型的值?

C#中的Math.Floor()为什么返回double而不是int

从MSDN文档中可以看到:

返回指定双精度浮点数小于或等于其的最大整数

它说它返回一个整数。虽然将其返回double,但我总是可以将其转换为int,但这很奇怪,不是吗?


1
这段话措辞不够准确。可以说它应该写成“整数”(或者在注释中加入其他说明),以避免与int数据类型的歧义。然而,integer是一个数学术语,因此虽然在这里容易引起混淆,但从技术上讲是正确的。 - user166390
2个回答

41

考虑到 double 的范围可以比 int 更大,因此并非如此。您不希望使用一个 double 类型的大值导致 int 类型发生溢出。

我来举个例子:

Double.MaxValue = 1.7976931348623157E+308

Integer.MaxValue = 2,147,483,647

因此,您可能有一个 double 值是 3,000,000,000.50,然后将它向下取整,这将导致 int 的最大值溢出。


3
这是为什么这样做有意义的很好的解释......然而,它为什么要这样做的解释要简单得多——FPU结果是“double”类型。由于经常需要将其用作“double”类型(例如从参数中减去以获取小数部分),因此转换再转换回来就没有意义了。 - Ben Voigt
1
@Ben Voigt - 也是一个好观点,但并不能解释为什么返回值不能是整数类型,因为文档似乎暗示了这一点。仅仅因为FPU输出了某些东西,并不意味着方法需要返回该结果,尤其是在非本地运行时环境中。MSDN文档可能应该使用“整数部分”或类似的短语来避免与类型名称混淆。 - userx
2
如果这只是一个大小问题,他们肯定可以返回 long / Int64 吧? - mike
我同意@userx的观点,我们也可以考虑转换成本。在双精度领域中,整数存在而反之则不然,因此最好将整数表示为双精度。 - Oakcool
2
@mynye - 即使是Long / Int64也不够大。Int64的MaxValue为9,223,372,036,854,775,807,即9E + 18。Double可以达到1E + 308,这要大得多。原因是double(和single / decimal)的部分结构表示分数的指数。Double和Int非常不同,用途也非常不同。我不会说将int表示为double更好,因为可能有一些情况下double可能不够精确(我不确定,double的小数部分有53位,但对于single来说肯定是真的)。 - userx

3

由于输入是一个double类型,输出也必须是double类型,否则许多潜在的输出将无法适应输出变量。

从数学角度来看,该函数的定义域值域必须具有相同的大小。


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