BigDecimal - 考虑逗号后的左零,如何知道小于 1 的小十进制数的精度

问题描述 投票:0回答:1

我正在开发一个计算器,我想仅当数字达到一定位数时才以科学计数法格式化数字。

我编写了这段代码,对于大数字来说效果很好。

DecimalFormat df;
if (valorSaida.stripTrailingZeros().precision() > FOCalcConstants.MAX_DIGITOS) {
    df = new DecimalFormat("0.################E00");
} else {
    df = new DecimalFormat("#.###################");
}
String strSaida = df.format(valorSaida).replace('.', ',');

MAX_DIGITOS
常量为 20,
BigDecimal
变量
valorSaida
的标度也为 20。

但是对于像 0.0000012345 这样的数字,精度远为 5,因此我永远无法获得该数字的小数部分的实际位数,因此我无法将其格式化为科学记数法。

该值不断被削减,直到达到 0.00000000000000000001。

有人可以帮助我吗?

scale()
方法在这种情况下没有用,因为它会返回
BigDecimal
变量中预定义的比例20。

我正在寻找一种无需像字符串那样操作数字的解决方案。

我尝试了上面的代码,但没有成功。

谢谢。

java precision scale bigdecimal digits
1个回答
0
投票

您需要同时使用

stripTrailingZeros
scale
,就像这样。

BigDecimal valorSaida = new BigDecimal("0.0000012345").setScale(20);
System.out.println("Scale before stripping: " + valorSaida.scale());
System.out.println("Scale before stripping: " + valorSaida.stripTrailingZeros().scale());

打印这个。

Scale before stripping: 20
Scale before stripping: 10

stripTrailingZeros()
返回的值的小数位数将是您需要的小数位数,以显示所有有效数字。

显然这与

precision()
返回的不同,因为它包含小数点和有效数字之间的零。

© www.soinside.com 2019 - 2024. All rights reserved.