日常踩坑:Java中double类型出现科学计数法问题

背景:在与银行的项目对接中,近期客户反馈支付失败,错误信息是:“付款金额格式有问题”,经过日志分析,发现客户系统发送银行系统时,付款金额以科学计数法的形式传递参数。

重现:

public static void main(String[] args) {
       double amount = 13000000d;
       System.out.println("付款金额:"+amount);
}
//运行结果:
付款金额:1.3E7

经过测试发现,浮点数(double、float)当整数部分超过7位以上(不含7位),就会自动转为科学计数法显示。

解决:可以转换为BigDecimal

public static void main(String[] args) {
        double amount = 13000001f;
        BigDecimal result = new BigDecimal(String.valueOf(amount)); //特别注意当构造参数类型为double时结果有一定的不可预知性,可能会出现new BigDecimal(0.1)所创建的BigDecimal正好等于0.1,但实际等于0.100000000000005……的情况(具体可进一步自查了解),所以请转换为String构造方法
        System.out.println("付款金额:"+result);
}
//运行结果
付款金额:13000001

至此,便可解决浮点数在数据传输过程中出现科学计数法的情况!

Java中,避免Double类型出现科学计数法有多种方法,以下为你详细介绍: ### 使用`NumberFormat`类 `NumberFormat`类可用于格式化数字,避免科学计数法的显示。以下是示例代码: ```java import java.text.NumberFormat; public class Main { public static void main(String[] args) { double d = 123456789.128d; String result = big(d); System.out.println(result); } private static String big(double d) { NumberFormat nf = NumberFormat.getInstance(); // 是否以逗号隔开, 默认true以逗号隔开,如[123,456,789.128] nf.setGroupingUsed(false); // 结果未做任何处理 return nf.format(d); } } ``` 上述代码中,`NumberFormat.getInstance()`获取一个通用的数字格式化实例,通过`setGroupingUsed(false)`方法设置不使用分组分隔符,最后使用`format`方法将`double`类型的数字转换为字符串,避免了科学计数法的显示 [^1]。 ### 使用`BigDecimal`类 `BigDecimal`类可用于精确的十进制计算,也能避免科学计数法。示例代码如下: ```java import java.math.BigDecimal; public class Main { public static void main(String[] args) { double d = 123456789.128d; String result = big2(d); System.out.println(result); } private static String big2(double d) { BigDecimal d1 = new BigDecimal(Double.toString(d)); BigDecimal d2 = new BigDecimal(Integer.toString(1)); // 四舍五入,保留2位小数 return d1.divide(d2, 2, BigDecimal.ROUND_HALF_UP).toString(); } } ``` 此代码中,先将`double`类型的值转换为`String`,再创建`BigDecimal`对象,通过`divide`方法进行除法运算,并设置四舍五入保留2位小数,最后将结果转换为字符串 [^1]。 ### 先转换为`String`再转换为`BigDecimal` 将`Double`类型先转换为`String`类型,再将`String`类型转换为`BigDecimal`,也可避免科学计数法。示例如下: ```java import java.math.BigDecimal; public class Main { public static void main(String[] args) { Double num1 = 0.0004; String strNum = new BigDecimal(num1.toString()).toString(); System.out.println(strNum); } } ``` 代码中,先把`Double`类型的`num1`转换为`String`,再用`String`创建`BigDecimal`对象,最后将其转换为字符串输出 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值