为何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
相关产品推荐
相关产品推荐

