每次我使用Math.Round/Floor/Ceiling
函数时,我总是将结果强制转换为int
(如果必要的话也可能是long
)。它们返回double
,但为什么呢?毕竟最终结果总是一个整数。
floor()
的双精度结果应用于整数(而不是double)四舍五入函数,而不是进行强制转换。否则,您需要编写自己的代码。C库版本的floor()
和ceil()
非常慢。
这是真的吗,还是我遗漏了什么?IEEE浮点标准中关于整数的精确表示有一些内容,但我不确定这是否使得转换安全。
我宁愿在函数中进行范围检查(如果需要避免溢出)并返回long类型。对于我的私人代码,我可以跳过范围检查。我一直在这样做:
long int_floor(double x)
{
double remainder;
long truncate;
truncate = (long) x; // rounds down if + x, up if negative x
remainder = x - truncate; // normally + for + x, - for - x
//....Adjust down (toward -infinity) for negative x, negative remainder
if (remainder < 0 && x < 0)
return truncate - 1;
else
return truncate;
}
ceil()
和round()
有相应的函数可以处理正负数,但是方法不同。
Int32
或 Int64
的代码中,直接使用四舍五入或向负无穷大舍入的方法进行映射会很有帮助。 - supercat文档中没有给出我能找到的原因。我最好的猜测是,如果您正在使用双精度浮点数,则很可能希望对双精度浮点数进行的任何操作都返回双精度浮点数。将其四舍五入以转换为int被语言设计者认为比保留为double更不常见。
您可以编写自己的方法,以大约2行代码将其转换为int,而且比在堆栈溢出上发布问题要少得多...
Int32
和Int64
,而没有明智的方法来使用重载来传达这一点。Java重载了round(double)
以返回long
,但重载了round(float)
以返回int
,有趣的是,在long
超过2^31时调用round
将会钉住它... - supercatlong
值强制转换为最大的int
值,并在其他大于 16777216 的long
值上调用它将产生舍入到最接近的float
的结果。 - supercat