【问题标题】:Java BigDecimal without E没有 E 的 Java BigDecimal
【发布时间】:2012-08-19 12:50:30
【问题描述】:

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

【问题讨论】:

  • 1e-10 是 0.0000000001,所以这只是表示的问题。
  • 试试toPlainString()

标签: java bigdecimal


【解决方案1】:

要获得不带指数部分的BigDecimalString 表示,您可以使用
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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 所以当 System.out.println(bd); 时,我假设打印的是 .toString() 表示,而不是 .toPlainString()
      • @AlexMills println 总是调用 toString (),即使是我相信的 String。
      【解决方案4】:

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

      1. stripTrailingZeros()
      2. if scale

      你可以试试这个 sn-p 来更好地理解行为

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-10
        • 1970-01-01
        • 1970-01-01
        • 2014-02-26
        • 1970-01-01
        • 1970-01-01
        • 2016-04-18
        • 2017-09-06
        相关资源
        最近更新 更多