13

我有一个 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

4 回答 4

21

要获得没有指数部分的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
于 2012-08-19T13:18:48.130 回答
3

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

于 2017-10-06T06:06:46.200 回答
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

我怀疑你试图做的任何事情都没有意义,因为你似乎试图获得一个不是你认为的值。

于 2012-08-20T20:06:22.750 回答
0

如果您想在 BigDecimal 对象上执行此操作,而不是使用格式化程序将其转换为字符串,您可以在 Java 8 上通过 2 个步骤执行此操作:

  1. stripTrailingZeros()
  2. if scale < 0 setScale to 0 if don't like esponential/scientific notation

您可以尝试此代码段以更好地理解行为

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
于 2017-11-07T10:27:44.463 回答