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

Java调用Math.pow()返回科学计数法浮点数致输出格式不符

问题根因

Math.pow()方法的返回值是double浮点数类型,Java中long类型值和double类型值做算术运算时,会自动将long提升为double,最终运算结果为double类型。此时调用out.println()输出时会匹配浮点数的重载方法,因此会出现.0后缀、大数值自动转为科学计数法的格式问题。
额外注意:double类型能精确表示的整数范围有限,当输入数值足够大时,还可能出现计算精度丢失的问题,当前测试用例未触发精度问题只是巧合。

解决方案

推荐优先使用整数运算实现10的幂计算,从根源上避免浮点数带来的格式、精度问题,这也是编程竞赛中的通用写法:

  • 核心思路是用long类型变量通过循环乘10得到对应数量级的基数,全程用整数运算,最终计算结果仍为long类型,输出时会自动匹配整数格式的重载方法。
  • 修改后的循环部分代码如下:
while (t-- > 0){
    String m = sc.next();
    long l = m.length(), n = Long.parseLong(m);
    long base = 1;
    for (int i = 1; i < l; i++) {
        base *= 10;
    }
    out.println(n - base);
}

如果要保留Math.pow()的写法,需要将运算结果强制转换为long类型后再输出,强制转换后会走整数输出逻辑,修改后的输出行代码如下:

out.println(n - (long)Math.pow(10, l-1));

注意:该写法存在精度风险,当10的幂次超过double的精确整数表示范围时,强转结果可能出错,仅适合数值范围较小的场景,不推荐竞赛场景使用。

两种改法运行你提供的测试用例,都会得到符合要求的纯整数输出,无浮点数后缀、无科学计数法格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:06:10