我正在开发一个计算器,我想仅当数字达到一定位数时才以科学计数法格式化数字。
我编写了这段代码,对于大数字来说效果很好。
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。
我正在寻找一种无需像字符串那样操作数字的解决方案。
我尝试了上面的代码,但没有成功。
谢谢。
您需要同时使用
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()
返回的不同,因为它包含小数点和有效数字之间的零。