【问题标题】:Printing the values as it is using BigDecimal in Java在 Java 中使用 BigDecimal 打印值
【发布时间】:2015-02-26 17:07:45
【问题描述】:

我需要将 csv 中的确切值存储到数据库中。列有货币值。所以 利用 BigDecimal 存储货币值。

考虑以下不同情况的示例:

案例一:

BigDecimal d=new BigDecimal(1);
System.out.println(d);

我得到了“1”作为预期的输出。

案例 2:

但是当我添加一个小数时,我会得到不同的结果。

BigDecimal d=new BigDecimal(1.1);           
System.out.println(d); 

我得到 '1.100000000000000088817841970012523233890533447265625' 作为上述代码的输出。

案例 3:

BigDecimal d=new BigDecimal(2.50);
System.out.println(d); 

我得到 '2.5' 作为上述代码的输出。在这种情况下它省略了零。

我的客户需要与传递到数据库中的完全相同的值。 因为,这些值与钱有关,所以我不能使用 String 来存储它们。

那么应该怎么做才能得到与我们传递给 Big Decimals 的完全相同的值呢?

【问题讨论】:

  • 如果你想要精确的值,不要使用双精度。 1.1 是双重的。改为传递"1.1"。关于 2.5 与 2.50,嗯,这些是完全相同的值。
  • @JBNizet 加一句关于为什么 1.1 是双精度的(并加上浮点运算这个术语),你就有答案了

标签: java database csv bigdecimal


【解决方案1】:

您可以将constructorString 参数一起使用。

BigDecimal d=new BigDecimal("1");
System.out.println(d.toString());//Will print 1



BigDecimal d=new BigDecimal("1.1");           
System.out.println(d.toString()); //Will print 1.1


BigDecimal d=new BigDecimal("2.50");
System.out.println(d.toString()); //Will print 2.50

【讨论】:

    【解决方案2】:

    使用这样的东西:

    BigDecimal decimal = new BigDecimal(2.0, new MathContext(2, RoundingMode.UNNECESSARY));
    

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 2015-02-14
      • 2014-02-10
      • 2012-08-23
      • 2017-11-06
      • 1970-01-01
      • 2022-11-27
      • 2013-07-04
      相关资源
      最近更新 更多