问题 没有E的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。


1436
2017-08-19 12:50


起源

1e-10是0.0000000001,所以这只是一个介绍问题。 - Paul Tomblin
尝试 toPlainString()。 - Keppil
谢谢Keppil,它有效。 - user1609993


答案:


得到一个 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

14
2017-08-19 13:18





也许使用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

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


1
2017-08-20 20:06



所以当System.out.println(bd);,我假设打印.toString()表示,而不是.toPlainString() - Alexander Mills
@AlexMills println总是调用toString(),即使对于我认为的String也是如此。 - Peter Lawrey


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


1
2017-10-06 06:06





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

  1. stripTrailingZeros()
  2. 如果scale <0 setScale为0,如果不喜欢指数/科学 符号

您可以尝试使用此代码段来更好地了解行为

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

0
2017-11-07 10:27