【发布时间】:2009-08-28 19:28:31
【问题描述】:
我需要从十进制或双精度中获取左侧整数值。例如:我需要从 4.6 中得到值 4。我尝试使用 Math.Floor 函数,但它返回一个双精度值,例如:它从 4.6 返回 4.0。 MSDN 文档说它返回一个整数值。我在这里错过了什么吗?还是有其他方法可以实现我的目标?
【问题讨论】:
-
MSDN 文档说它返回一个整数值。 MSDN documentation 声明 Math.Floor 返回 System.Double,而不是整数。
-
一个整数 value 是有效的,但这并不意味着它可以存储在“int”或“long”中。 “double”成功地存储了比“int”更宽的范围内的所有整数值注意,当尾数部分没有足够的位来存储整数值的所有数字时,一些整数值可能会被舍入,当它的基数为 2 指数时大于 52:对于大于 2^52 或小于 -2^52 的整数,可能会在“double”中舍入整数值,但结果仍将是可表示的最接近的整数;如果您使用“(long)Floor(x)”,则转换可能很大程度上是错误的。
-
但是请注意,可以用“double”表示的整数值的有效范围非常大,绝对值最大为:(1 + (1 − 2^−52)) × 2 ^1023 ≈ 1.7976931348623157E308;它比“long”的 2^63-1 多得多。但是,可以完全存储的整数范围受到更多限制,因为“双精度”只有 52 位尾数(加上 1 位隐含的最高有效位,未存储),这意味着“双精度”只能存储仅当它们的绝对值低于 2^53 时才使用整数。
-
不幸的是,如果可能,Math.Floor() 不会在内部使用“Long”返回变量“Number”类型,否则仅用于较大的舍入整数。而标准的数学库不处理这种统一的变量数字类型。存在其他实现统一数字类型的数学库,包括以压缩十进制或二进制编码的 Long、Double 或大整数,而不会丢失支持的范围或精度。