辨析BigDecimal的toString()方法和toPlainString()方法
toString()
toString方法会将BigDecimal的值以科学计数方式的字符串
但是转换成科学计数的方式也是有场景的,并不是所有的值都会转为科学计数方式的字符串,网上好几篇文章感觉都是照搬的一样,并没有详细的说明什么情况会以科学计数的方式输出字符串, 只能自己去扒了一下源码,
首先,任何一个BigDecimal都可以使用一个公式表示:
unscaledValue × 10-scale
解释一下:
unscaledValue :整数非标度值 (即去掉小数点的Bigdecimal的值,类型为BigInteger)
scale:标度值,如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负 scale 次幂。
如下,BigDecimal值为123.00,则unscaledValue 为12300,而scale为2,套用公式,则数值是相等的。
然后再来看源码中toString方法中给的example:
源码中该方法有很长的注释,主要介绍指数计算转换过程,简要总结了两种toString()方法会以科学计数方式输出的场景:
场景一:scale为负数,一定会转换为科学计数的方式
场景二:
需要先计算变动指数的值。公式为-scale+(unscaleValue.length-1),如果该值小于-6,那么则会使用科学计数的方式输出字符串
toPlainString()
原值输出为字符串
总结
当我们使用BigDecimal转成字符串时,大多其实是想单纯的使用toString方法,而并不想使用科学计数的方式,所以应该使用的是toPlainString方法