首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java BigDecimal行为

Java BigDecimal行为
EN

Stack Overflow用户
提问于 2014-05-08 18:04:56
回答 2查看 144关注 0票数 2

我第一次用BigDecimals编程。

为什么两个节目的行为不同?

代码语言:javascript
复制
   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文件中输入quantity作为2的值时,检索如下:

代码语言:javascript
复制
     BigDecimal q = new BigDecimal("2");
     which gives me big decimal with scale as 0 and precision as 1 with value as 2.

当我从DB检索相同的值时,使用

代码语言:javascript
复制
      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值进行比较。

代码语言:javascript
复制
     However I don't understand how to have same string representation of two bigdecimals with same value with different precision. I know 2 and 2.0000 are not technically same for computer but for users they are same.

所以我想要同样的代表。我也试着计算它们的哈希码,但它们也不同,这是正确的,因为它们对于计算机来说是完全不同的数字。

那么,如何将2作为BigDecimal转换为2.0000大小数位,以便获得相同的字符串表示形式。

事实证明,这对我来说是个阻碍

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-08 18:07:30

如果我明白你的意思,你就错过了setScale()的作业结果;

代码语言:javascript
复制
d = d.setScale(4);

编辑

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

代码语言:javascript
复制
d = d.stripTrailingZeros();
票数 4
EN

Stack Overflow用户

发布于 2014-05-08 18:06:36

BigDecimal是不变的。通过呼叫:

代码语言:javascript
复制
d.setScale(4);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23549341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档