没有E的Java BigDecimal

时间:2012-08-19 12:50:30

标签: java bigdecimal

我有一个BigDecimal变量

BigDecimal x = new BigDecimal("5521.0000000001");

公式:

x = x.add(new BigDecimal("-1")
      .multiply(x.divideToIntegralValue(new BigDecimal("1.0"))));

我想删除整数部分,以获取值x = ("0.0000000001"),但我的新值是1E-10而不是0.0000000001。

4 个答案:

答案 0 :(得分:17)

要获得String没有指数部分的BigDecimal表示,您可以使用
BigDecimal.toPlainString()。在您的示例中:

BigDecimal x = new BigDecimal("5521.0000000001");
x = x.add(new BigDecimal("-1").
              multiply(x.divideToIntegralValue(new BigDecimal("1.0"))));
System.out.println(x.toPlainString());

打印

0.0000000001

答案 1 :(得分:1)

也许使用BigDecimal并不能真正帮助你。

double d = 5521.0000000001;
double f = d - (long) d;
System.out.printf("%.10f%n", f);

打印

0.0000000001

但值5521.0000000001只是一种近似表示。

实际的表示是

double d = 5521.0000000001;
System.out.println(new BigDecimal(d));
BigDecimal db = new BigDecimal(d).subtract(new BigDecimal((long) d));
System.out.println(db);

打印

5521.000000000100044417195022106170654296875
1.00044417195022106170654296875E-10

我怀疑你想要的任何东西都没有意义,因为你似乎试图获得的价值不是你想象的那样。

答案 2 :(得分:1)

尝试使用BigDecimal.toPlainString()根据需要将值作为纯字符串获取。

答案 3 :(得分:0)

如果要在BigDecimal对象上执行此操作而不将其转换为带有格式化程序的String,则可以在Java 8上执行以下两步:

  1. stripTrailingZeros()
  2. 如果比例< 0如果不喜欢指数/科学,则setScale为0 符号
  3. 您可以尝试使用此代码段来更好地了解行为

    BigDecimal bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
    bigDecimal = bigDecimal.setScale(2);
    bigDecimal = bigDecimal.stripTrailingZeros();
    if (bigDecimal.scale()<0)
    bigDecimal= bigDecimal.setScale(0);
    System.out.println(bigDecimal);//50
    bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
    bigDecimal = bigDecimal.setScale(2);
    bigDecimal = bigDecimal.stripTrailingZeros();
    if (bigDecimal.scale()<0)
    bigDecimal= bigDecimal.setScale(0);
    System.out.println(bigDecimal);//50.2
    bigDecimal = BigDecimal.valueOf(Double.parseDouble("50"));
    bigDecimal = bigDecimal.setScale(2);
    bigDecimal = bigDecimal.stripTrailingZeros();
    System.out.println(bigDecimal);//5E+1
    bigDecimal = BigDecimal.valueOf(Double.parseDouble("50.20"));
    bigDecimal = bigDecimal.setScale(2);
    bigDecimal = bigDecimal.stripTrailingZeros();
    System.out.println(bigDecimal);//50.2