我在Java(Android Studio)中格式化BigDecimal
时遇到问题!
我希望将BigDecimal
格式化为String
大于 16个字符, 9小数加上指数({{1} })。
我使用了0.000000000e+00
,但结果不正确,它是String#format
而不是1.000000000e+32
。
如何以正确的格式获取号码?这是代码。
9.99999999e+31
String b = "9999999999999999";
String c = "9999999999999999";
BigDecimal resultMultyply = (new BigDecimal(b)).multiply(new BigDecimal(c));
String main_number = resultMultyply.toString();
if (main_number.length() > 16) {
// main_number = 99999999999999980000000000000001
main_number = String.format("%16.9e", new BigDecimal(main_number));
// main_number = 1.000000000e+32
}
在格式化之前是正确的。
答案 0 :(得分:2)
DecimalFormat
DOWN
您的问题是,在创建输出值时,您没有完成舍入模式。 BigDecimal
的默认舍入模式为HALF_UP
,这不是您想要的:您希望按原样查看前几位数字。这意味着您在预期精度之后丢弃数字,这转换为舍入DOWN
。不幸的是,BigDecimal
默认情况下不提供这样的细粒度。所以你必须使用DecimalFormat
。
总而言之,它的工作方式如下:
import java.math.*;
import java.text.*;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("9999999999999999");
BigDecimal mul = a.multiply(a);
System.out.println(format(mul, 9));
}
private static String format(BigDecimal x, int scale) {
NumberFormat formatter = new DecimalFormat("0.0E0");
formatter.setRoundingMode(RoundingMode.DOWN);
formatter.setMinimumFractionDigits(scale);
return formatter.format(x);
}
}
输出:
9.999999999E31