You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Math.round(6.022e23)返回结果与预期不符?Java技术求助

为什么Math.round(6.022e23)返回long最大值而不是预期的602200000000000000000000?

问题根源

  • double类型的精度瓶颈:你写的6.022e23是double类型字面量,但double的尾数只有52位,只能精确表示-253到253之间的整数(大概±9×10¹⁵)。602200000000000000000000远超出这个范围,所以这个double值本身已经是个近似值,根本不是你预期的精确整数。
  • 超出long的取值范围:long类型的最大值是9223372036854775807(也就是2⁶³-1),而6.022e23对应的近似double值已经超过了这个上限,按照Java的规则,当Math.round()处理的数值超出long范围时,会直接返回long的最大值,这就是你看到结果的原因。

正确的解决方式

要精确处理这种超大十进制数,得用BigDecimal类型,它支持任意精度的十进制运算。修改后的代码如下:

import java.math.BigDecimal;

public class MathRound {
    public static void main(String[] args) {
        // 用字符串初始化BigDecimal,避免double精度丢失
        BigDecimal exactValue = new BigDecimal("6.022e23");
        // 转成普通字符串输出,避免科学计数法
        System.out.println(exactValue.toPlainString());
    }
}

运行这段代码会输出精确的602200000000000000000000。

内容的提问来源于stack exchange,提问作者Benjamin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:17:43