1

我必须处理非常大的 double 值,并且必须将它们四舍五入到下一个完整数字。如果我将双精度值舍入,我总是会收到值9.223372036854776E18,这恰好是最大的 long 值。我如何舍入比这更大的值?

编辑:只是为了澄清:我不是 Java 程序员,来自 C 前端。我正在帮助一个朋友处理这个案子。我尝试了未签名(显然没有工作),谷歌搜索并找到了 BigDecimal 和 BigInteger。尝试铸造它们,它碰巧崩溃了。这就是我来这里的原因。谢谢你帮助我!

4

5 回答 5

5

BigDecimal将是包含大于 long 的值的解决方案。

阅读这个BigDecimal javadoc

您需要实例化BigDecimal(yourDoubleValue);而不是强制转换。

于 2012-11-09T03:18:17.283 回答
3

在本质上:

Math.floor(d+0.5)

d但如果是负数,你必须调整减法。

于 2012-11-09T03:45:53.563 回答
2

使用BigDecimal

例如

BigDecimal decimalA = new BigDecimal("98765432123456789");
于 2012-11-09T03:19:02.770 回答
2

BigDecimal 可以保存任何双精度和浮点值。要将 double 转换为 BigDecimal,请使用如下代码:

double reallyBigDouble
BigDecimal x = new BigDecimal(reallyBigDouble);

要四舍五入到最接近的整数值,您可以使用如下代码:

BigDecimal roundedToInteger = x.round(new MathContext(MathContext.UNLIMITED));
于 2012-11-09T03:23:34.467 回答
2

任何double太大而无法放入 along的值已经表示一个整数值,并且对其进行四舍五入将无效。这是因为 double 的有效位仅保留 52 位精度,而 long 保留 64 位——因此,如果值对于 a 来说太大long,则double剩下的精度不足以容纳任何小数部分。

于 2012-11-09T04:07:53.210 回答