我试图只使用浮点数后的8位数,并将其余数字舍入到上限。当输入为0.0时,舍入操作后,我得到的是0E-8而不是0.00000000
0E-8
0.00000000
val test = BigDecimal.valueOf(0.0) println(test.setScale(8, RoundingMode.CEILING))
当我将该值更改为2.0时,结果与我预期的2.00000000一致我是新来的,我不明白为什么。
2.00000000
92dk7w1h1#
toString是否以指数表示法返回数字的文档如下:首先,使用没有前导零的字符“0”到“9”(除非其值为零,在这种情况下使用单个“0”字符),将BigDecimal的未缩放值的绝对值转换为以十为基数的字符串。接着,计算一调整指数;这是取反后的小数位数加上转换后的未换算值中的字符数减1。即-scale+(ulength-1),其中ulength是未换算值的绝对值的十进制位数长度(其精度)。如果小数位数大于或等于零,并且调整后的指数大于或等于-6,则该数字将转换为字符形式,而不使用指数表示法。否则(也就是说,如果小数位数为负,或者调整后的指数小于-6),该数字将使用指数表示法转换为字符形式。在0的情况下,根据文档,未缩放的值为“0”。它的长度为1。因此,调整后的指数为-8 +(1 - 1)= -8。它小于-6,因此以指数表示法显示。当数字为2时,未缩放的值为“200000000”,缩放比例为8时,缩放比例为“2.00000000”。未缩放的值的长度为9。因此,调整后的指数为-8 +(9 - 1)= 0。它大于-6,而8的小数位数大于0,因此2.00000000不会以指数表示法显示。注意,通过调用toPlainString,您始终可以得到一个不是指数表示法的字符串。
toString
BigDecimal
-scale+(ulength-1)
ulength
toPlainString
1条答案
按热度按时间92dk7w1h1#
toString
是否以指数表示法返回数字的文档如下:首先,使用没有前导零的字符“0”到“9”(除非其值为零,在这种情况下使用单个“0”字符),将
BigDecimal
的未缩放值的绝对值转换为以十为基数的字符串。接着,计算一调整指数;这是取反后的小数位数加上转换后的未换算值中的字符数减1。即
-scale+(ulength-1)
,其中ulength
是未换算值的绝对值的十进制位数长度(其精度)。如果小数位数大于或等于零,并且调整后的指数大于或等于-6,则该数字将转换为字符形式,而不使用指数表示法。
否则(也就是说,如果小数位数为负,或者调整后的指数小于-6),该数字将使用指数表示法转换为字符形式。
在0的情况下,根据文档,未缩放的值为“0”。它的长度为1。因此,调整后的指数为-8 +(1 - 1)= -8。它小于-6,因此以指数表示法显示。
当数字为2时,未缩放的值为“200000000”,缩放比例为8时,缩放比例为“2.00000000”。未缩放的值的长度为9。因此,调整后的指数为-8 +(9 - 1)= 0。它大于-6,而8的小数位数大于0,因此2.00000000不会以指数表示法显示。
注意,通过调用
toPlainString
,您始终可以得到一个不是指数表示法的字符串。