Java BigDecimal 行为

标签 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 类型为具有不同比例的 Decimal 例如,数量是比例定义为 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 以便我可以获得相同的字符串表示形式。

事实证明这对我来说确实是一个障碍

最佳答案

如果我理解你的意思,你已经错过了 setScale() 结果的分配;

d = d.setScale(4);

编辑

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

d = d.stripTrailingZeros();

关于Java BigDecimal 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23549341/

相关文章:

java - java中的FFMPEG进度条

java - 检查字符串是否不仅包含整数

Java源码protoc编译后有很多错误

java - 在浏览器 (Firefox) 上打印代码

Python - 哈希二进制值

windows - 如何使用 Perl 从 Windows 命令行获取文件的 SHA1 哈希值?

安卓。遗失证书如何找回

ruby - BigDecimal 上的 rspec 错误是否有覆盖?

java - 将数字 (22,21) 映射到 BigDecimal 时,Hibernate 在结果中丢失精度

java - 如何使用 ApfloatMath.round()?