具有指数的BigDecimal格式

时间:2017-12-04 11:20:05

标签: java bigdecimal exponential largenumber

我在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 } 在格式化之前是正确的。

1 个答案:

答案 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