java - 使用 BigDecimal 处理货币

标签 java currency bigdecimal

我试图使用 long 为货币创建自己的类,但显然我应该使用 BigDecimal 代替。有人可以帮我开始吗?将 BigDecimals 用于美元货币的最佳方式是什么,例如至少但不超过 2 位美分等。BigDecimal 的 API很大,不知道用什么方法。另外,BigDecimal 具有更好的精度,但是如果它通过 double 不是全部丢失了吗?如果我执行 new BigDecimal(24.99),它与使用 double 有何不同?还是应该改用使用 String 的构造函数?

最佳答案

这里有一些提示:

  1. 如果您需要它提供的精度,请使用 BigDecimal 进行计算(货币值(value)通常需要这个)。
  2. 使用 NumberFormat展示类。本类(class)将处理不同货币金额的本地化问题。但是,它只接受原语;因此,如果您可以接受由于转换为 double 而导致的准确性的微小变化,则可以使用此类。
  3. 使用 NumberFormat 类时,使用 BigDecimal 实例上的 scale() 方法来设置精度和舍入方法。

PS:如果您想知道,BigDecimal is always better than double, when you have to represent money values in Java .

PPS:

创建 BigDecimal 实例

这很简单,因为 BigDecimal provides constructors to take in primitive values , 和 String 对象。你可以使用那些,preferably the one taking the String object .例如,

BigDecimal modelVal = new BigDecimal("24.455");
BigDecimal displayVal = modelVal.setScale(2, RoundingMode.HALF_EVEN);

显示 BigDecimal 实例

您可以使用 setMinimumFractionDigitssetMaximumFractionDigits 方法调用来限制显示的数据量。

NumberFormat usdCostFormat = NumberFormat.getCurrencyInstance(Locale.US);
usdCostFormat.setMinimumFractionDigits( 1 );
usdCostFormat.setMaximumFractionDigits( 2 );
System.out.println( usdCostFormat.format(displayVal.doubleValue()) );

关于java - 使用 BigDecimal 处理货币,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1359817/

相关文章:

java - nextInt(int) 对于 Random 类型是未定义的

Java网络服务: empty arrays

sql - 将钱存储在小数列中 - 什么精度和比例?

java - 纸牌游戏 - 玩家手牌选择排序问题

java - 如何注册在消息转换器之前工作的RestController拦截器?

java - 如何将货币金额(美国或欧盟)解析为 Java 中的浮点值

ruby-on-rails - 从 ruby 字符串中解析印度货币

java - 如何从 Java 8 中的对象列表中获取两个属性的乘积

java - BigDecimal 乘法返回 0?

Java 精确计算 - 使用选项