Java中double乘1000输出科学计数法而非预期格式的问题
解决Java数值输出科学计数法及自定义千位分隔符问题
你的代码计算逻辑是正确的,输出科学计数法和"未按预期右移小数位"都是输出格式问题,和使用float/double类型无关——当double数值超过一定范围时,System.out.println默认会用科学计数法展示,而计算结果本身是正确的:125000/(1-0.035)*1000确实等于129533678.7564766。
要实现你想要的带自定义千位分隔符的格式,直接用Java的DecimalFormat类即可,以下是两种方案:
方案1:普通三位千位分隔符(通用格式)
如果需要常规的三位一组分隔(如129,533,678.7564766),代码修改如下:
package test; import java.text.DecimalFormat; public class mulcheck { public static void main(String[] args) { double output = (125000 / (1 - 0.035)); double finout = output * 1000; // 配置格式:三位千位分隔符,保留7位小数 DecimalFormat df = new DecimalFormat("#,###.0000000"); System.out.println(df.format(finout)); } }
方案2:自定义两位分组(匹配你的预期格式)
如果需要你指定的12,95,33,678.7564766这种从右往左先三位、再每两位分组的格式,需要自定义分组规则:
package test; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; public class mulcheck { public static void main(String[] args) { double output = (125000 / (1 - 0.035)); double finout = output * 1000; DecimalFormatSymbols symbols = new DecimalFormatSymbols(); symbols.setGroupingSeparator(','); // 格式规则:整数部分从右到左,最后三位一组,前面每两位一组,保留7位小数 DecimalFormat df = new DecimalFormat("#,##,##,##0.0000000", symbols); System.out.println(df.format(finout)); } }
关键说明
DecimalFormat的模式字符串中,#表示可选数字,0表示必须存在的数字;.0000000强制保留7位小数。- 分组分隔符通过
DecimalFormatSymbols设置,确保使用逗号作为分隔符。 - 不需要切换float类型,double的精度完全满足你的计算需求,问题核心是输出格式化而非数值计算。
内容的提问来源于stack exchange,提问作者hachi__man
相关产品推荐
相关产品推荐

