我必须处理非常大的 double 值,并且必须将它们四舍五入到下一个完整数字。如果我将双精度值舍入,我总是会收到值9.223372036854776E18,这恰好是最大的 long 值。我如何舍入比这更大的值?
编辑:只是为了澄清:我不是 Java 程序员,来自 C 前端。我正在帮助一个朋友处理这个案子。我尝试了未签名(显然没有工作),谷歌搜索并找到了 BigDecimal 和 BigInteger。尝试铸造它们,它碰巧崩溃了。这就是我来这里的原因。谢谢你帮助我!
我必须处理非常大的 double 值,并且必须将它们四舍五入到下一个完整数字。如果我将双精度值舍入,我总是会收到值9.223372036854776E18,这恰好是最大的 long 值。我如何舍入比这更大的值?
编辑:只是为了澄清:我不是 Java 程序员,来自 C 前端。我正在帮助一个朋友处理这个案子。我尝试了未签名(显然没有工作),谷歌搜索并找到了 BigDecimal 和 BigInteger。尝试铸造它们,它碰巧崩溃了。这就是我来这里的原因。谢谢你帮助我!
在本质上:
Math.floor(d+0.5)
d
但如果是负数,你必须调整减法。
BigDecimal 可以保存任何双精度和浮点值。要将 double 转换为 BigDecimal,请使用如下代码:
double reallyBigDouble
BigDecimal x = new BigDecimal(reallyBigDouble);
要四舍五入到最接近的整数值,您可以使用如下代码:
BigDecimal roundedToInteger = x.round(new MathContext(MathContext.UNLIMITED));
任何double
太大而无法放入 along
的值已经表示一个整数值,并且对其进行四舍五入将无效。这是因为 double 的有效位仅保留 52 位精度,而 long 保留 64 位——因此,如果值对于 a 来说太大long
,则double
剩下的精度不足以容纳任何小数部分。