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序列化和反序列化。浏览器接收到科学计数法的数据之后当作数值来处理)。