繁体   English   中英

Java BigDecimal行为

[英]Java BigDecimal Behaviour

我第一次使用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类型为小数位数,具有不同的小数位数,例如,数量是小数位数定义为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.

当我使用从数据库检索相同的值时

      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

现在,由于必须在数据库中的所有记录中比较CSV中的数百条记录,因此我正在考虑创建数据库中所有记录的SHA1值,并将其与CSV记录内容的SHA1值进行比较。
但是我不明白如何以相同的值具有不同精度的两个大十进制的字符串表示形式相同。 我知道2和2.0000在计算机上在技术上并不相同,但对于用户来说它们是相同的。
所以我想对它们有相同的表示。 我也尝试计算它们的哈希码,但是它们也不同,这是正确的,因为它们对于计算机而言是完全不同的数字。
因此,如何将2作为BigDecimal转换为2.0000 Bigdecimal,以便获得相同的String表示形式。

事实证明,这确实是我的阻碍

如果我理解您,您会错过setScale()结果的分配;

d = d.setScale(4);

编辑

至于第二个问题,您可以调用stripTrailingZeros() -

d = d.stripTrailingZeros();

BigDecimal是不可变的。 通过致电:

d.setScale(4);

您只是创建新实例,而不使用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM