87_BigDecimal的doubleValue()、toString()、toPlainString()与科学计数法

主题:BigDecimal.toPlainString()可以避免出现科学计数法格式的数据。

项目上面有个小伙伴在用Bigdecimal进行数值计算时,用return num.doubleValue()+"";的方式将结果送到前台,测试数值较小时无问题,实际项目运行时,数值较大,结果页面显示的内容变为科学计数法形式。发现问题后,又一小伙伴将之改为return num.toString();,结果显示恢复正常。偶然的机会,我看到这个代码时,发现了这个错误,我记得toString()在某些特定的数值上会变为科学计数法,而toPlainString()这个方法才是永恒不变,始终显示Bigdecimal的原本数值。为了说服小伙伴,我花了几分钟时间写了个测试的方法,代码如下:

import java.math.BigDecimal;
 
public class Test {
 
    public static void main(String[] args) {
        BigDecimal a1 = new BigDecimal("1");
        // 小数位数递增
        for (int i = 0; i < 20; i++) {
            a1 = a1.multiply(new BigDecimal("0.1"));
            System.out.println("----------------------" + (i + 1) + "位小数时的输出结果-------------------------");
            System.out.println("doubleValue方法显示数值:                         " + a1.doubleValue());
            System.out.println("toString方法显示数值:                                 " + a1.toString());
            System.out.println("toPlainString方法显示数值:                    " + a1.toPlainString());
        }
        System.out.println("\n\n");
        a1 = new BigDecimal("1");
        // 整数位数递增
        for (int i = 1; i < 20; i++) {
            a1 = a1.multiply(new BigDecimal("10"));
            System.out.println("----------------------" + (i + 1) + "位整数时的输出结果-------------------------");
            System.out.println("doubleValue方法显示数值:                         " + a1.doubleValue());
            System.out.println("toString方法显示数值:                                 " + a1.toString());
            System.out.println("toPlainString方法显示数值:                    " + a1.toPlainString());
        }
        System.out.println("\n\n");
        // 始终两位小数位,整数位递增
        a1 = new BigDecimal("1");
        for (int i = 1; i < 30; i++) {
            a1 = a1.setScale(0, BigDecimal.ROUND_DOWN).multiply(new BigDecimal("10.11"));
            System.out.println("----------------------" + i + "位整数,2位小数时的输出结果-------------------------");
            System.out.println("doubleValue方法显示数值:                         " + a1.doubleValue());
            System.out.println("toString方法显示数值:                                 " + a1.toString());
            System.out.println("toPlainString方法显示数值:                    " + a1.toPlainString());
        }
        System.out.println("\n\n");
        // 小数位、整数位同时递增
        a1 = new BigDecimal("1");
        for (int i = 1; i < 30; i++) {
            if (i % 2 == 0) {
                a1 = a1.multiply(new BigDecimal("10"));
            } else {
                a1 = a1.multiply(new BigDecimal("10.1"));
            }
            System.out.println(
                    "----------------------" + (i + 1) + "位整数," + ((i + 1) / 2) + "位小数时的输出结果-------------------------");
            System.out.println("doubleValue方法显示数值:                         " + a1.doubleValue());
            System.out.println("toString方法显示数值:                                 " + a1.toString());
            System.out.println("toPlainString方法显示数值:                    " + a1.toPlainString());
        }
    }
}


运行结果如下:

4位小数时,doubleValue()显示变为科学计数法。7位小数时,toString()变为科学计数法。toPlainString()始终无变化。

8位整数时,doubleValue()显示变为科学计数法。

当整数、小数位数皆增长时,doubleValue()变为科学计数法,其他两种方法不变。

由以上测试,得出结论,toString()在某些情况下显示数值会变为科学计数法,而toPlainString()始终精确显示数值本身。

原文:https://blog.csdn.net/u013742303/article/details/80591187 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值