Java BigDecimal行为

时间:2014-05-08 18:04:57

标签: java sha1 bigdecimal

我第一次使用BigDecimals进行编程。

为什么以下两个程序的行为不同

   1) BigDecimal d = new BigDecimal("2.01").setScale(4);
      System.out.println(d);
      Gives me : 2.0100

  And 

   2) BigDecimal d = new BigDecimal("2.01");
      d.setScale(4);
  System.out.println(d);  
      Gives me : 2.01

为什么会这样?

此外,我还有一项功能,我需要使用一些BigDecimal值将CSV文件中的行与DB记录记录进行比较。     DB列的DB类型为Decimal,具有不同的比例   例如,Quantity是具有定义为4的比例的列。       当用户在CSV文件中输入数量值为2时,检索如下:

     BigDecimal q = new BigDecimal("2");
     which gives me big decimal with scale as 0 and precision as 1 with value as 2.

当我使用

从DB检索相同的值时
      rs.getBigDecimal(54) where 54 is column index, 
  I get Big decimal with precision as 0 and scale as 4 with value as 2.0000

现在由于我必须在DB中的所有记录中比较CSV中的数百条记录,我正在考虑创建DB中所有记录的SHA1值,并将其与CSV记录内容的SHA1值进行比较。
        但是我不明白如何使用具有不同精度的相同值的两个bigdecimal具有相同的字符串表示。我知道2和2.0000在技术上不同于计算机,但对于用户来说它们是相同的  所以我希望对它们有相同的表示。我也试过计算他们的哈希码,但它们也是不同的,因为它们对于计算机来说完全不同  那么如何将BigDecimal转换为2.0000 Bigdecimal,以便我可以获得相同的String表示。

这确实是我的阻挡者

2 个答案:

答案 0 :(得分:4)

如果我理解你,你就错过了setScale()的结果中的作业;

d = d.setScale(4);

修改

至于你的第二个问题,你可以致电stripTrailingZeros() -

d = d.stripTrailingZeros();

答案 1 :(得分:1)

BigDecimal是不可变的。致电:

d.setScale(4);

您只需创建新实例并且不要使用它。