Java BigDecimal出现科学计数法

Java BigDecimal出现科学计数法

查看BigDecimal的toString()源码,可以发现出现toString()出现科学计数法的原因

	private String layoutChars(boolean sci) {
       ...
        int coeffLen = coeff.length - offset;
        long adjusted = -(long)scale + (coeffLen -1);
        if ((scale >= 0) && (adjusted >= -6)) { // plain number
           ...
        } else { // E-notation is needed
            if (sci) {                       // 是否使用科学计数法
                buf.append(coeff[offset]);   // first character
                if (coeffLen > 1) {          // more to come
                    buf.append('.');
                    buf.append(coeff, offset + 1, coeffLen - 1);
                }
            }
	...
        return buf.toString();
    }

BigDecimal方法会根据数字的具体精度位数,来判断是否需要使用科学计数法。

验证代码

public static void main(String[] args) {
        BigDecimal decimal = new BigDecimal("0.00000000000009");
        DecimalFormat decimalFormatNumberOfDecimalPlaces2 = (DecimalFormat) NumberFormat.getNumberInstance(Locale.CHINA);
        decimalFormatNumberOfDecimalPlaces2.applyPattern("#,##0.00");
        System.out.println(decimal.toString());  //输出:9E-14
        System.out.println(decimal.toPlainString()); //输出: 0.00000000000009
        System.out.println(decimalFormatNumberOfDecimalPlaces2.format(decimal)); //输出:0.00
        Map<String, Object> map = new java.util.HashMap<>();
        map.put("a", decimal);
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            String json = objectMapper.writeValueAsString(map);
            System.out.println(json); // 输出:{"a":9E-14}
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

运行代码,输出结果为

9E-14
0.00000000000009
0.00
{"a":9E-14}

结论:

  • BigDecimal方法会根据数字的具体精度位数,来判断是否需要使用科学计数法。
  • 如果确认不使用科学计数法,可以使用toPlainString()函数。
  • 使用DecimalFormat格式化之后,显示非科学计数法。
  • 使用jackson将对象序列化,jackson会将科学计数法表示的变量看作是数值。(SpringBoot下,默认使用Jackson序列化和反序列化。浏览器接收到科学计数法的数据之后当作数值来处理)。

posted on 2024-04-19 10:10  zhaoLei_Free  阅读(1367)  评论(0编辑  收藏  举报

导航