在Java中使用哪种舍入模式进行货币操作?

时间:2011-11-21 08:11:09

标签: java bigdecimal

我已在java网站上阅读使用BigDecimal作为货币。 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

但是我们应该使用哪种舍入模式?这是最合适的,也是最广泛的我们

5 个答案:

答案 0 :(得分:48)

没有“正确”模式,这取决于商业案例。例子:

  • 在计算年度税时,分数通常会被切断(RoundingMode.FLOOR)。
  • 在计算奖金时,您可能希望始终支持客户(RoundingMode.CEILING)。
  • 对于账单上的税,您通常会围绕HALF_UP
  • 在进行复杂的财务模拟时,您根本不想进行回合。

documentation of RoundingMode包含很多不同模式如何工作的例子。

要获得更好的答案,您必须告诉我们您想要达到的目标。

也就是说,BigDecimal是在Java中使用的正确类型,因为它可以保留任何精度,而且它允许您选择最适合您的情况的舍入模式。

答案 1 :(得分:18)

大部分时间BigDecimal是货币的唯一有效选择。但是,舍入策略的选择并不那么明显。

默认为HALF_EVEN,这恰好是一个不错的选择。此算法称为银行家舍入(参见讨论here)。

另一种常见策略是HALF_UP,它更直观但统计特征略差。

另请注意,在很多时候(特别是在银行和保险业),舍入策略将由业务需求决定,对于各种用例通常会有所不同。

答案 2 :(得分:11)

通常你会使用“半上升”舍入,如下所示:

myBigDecimal.setScale(2, RoundingMode.HALF_UP);

通过这种方式,你可以舍入到两个小数位(大多数货币都使用,例如美元和美分,显然有例外情况),并且你将围绕值,这样半个或更多的数据将会向上舍入而小于半个百分点将向下舍入。有关详细信息,请参阅the javadoc

答案 3 :(得分:4)

对于财务应用程序,ROUND_HALF_EVEN是最常见的舍入模式。该模式避免了偏见。 但是对于显示,你应该使用NumberFormat类。本课程将处理不同货币金额的本地化问题。但是NumberFormat只接受原语。因此,如果您可以接受转换为double的小精度更改,请使用最后一个。

答案 4 :(得分:-9)

您绝不应对货币使用小数类型。使用整数类型。这样可以保持准确性,避免与浮动相关的舍入错误

当显示金额然后除以适当的因子以得到非整数部分。

相关问题