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

