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

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

但是我们应该使用什么舍入模式呢? 这是我们最合适的和最广泛的

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

  • 在计算年税时,分数通常会被切断( RoundingMode.FLOOR )。
  • 在计算奖金时,您可能希望总是以顾客为中心( RoundingMode.CEILING )。
  • 对于账单税,你通常会轮到HALF_UP
  • 在进行复杂的金融模拟时,您根本不想整理。

RoundingMode的文档包含了很多不同模式的例子。

为了得到更好的答案,你必须告诉我们你想达到什么目的。

也就是说, BigDecimal是在Java中使用的正确types,因为它可以保留任意数量的精度,并且可以让您select最适合您的情况的舍入模式。

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

默认是HALF_EVEN ,这恰好是一个不错的select。 这个algorithm被称为银行家舍入 (参见这里的讨论)。

另一个常见的策略是HALF_UP ,它更直观,但统计特性略差。

还要注意的是,在很多时候(特别是在银行业和保险业),取整策略将取决于业务需求,对于各种使用情况通常是不同的。

通常情况下,您可以使用“half up”舍入,如下所示:

 myBigDecimal.setScale(2, RoundingMode.HALF_UP); 

用这种方法,你可以舍入到小数点后两位(大多数货币使用的数字,例如美元和美分,显然有例外),你可以把价值凑成半分或更多,而不到半分将下降。 有关更多详细信息,请参阅javadoc 。

对于财务应用程序来说,ROUND_HALF_EVEN是最常见的舍入模式。 该模式避免了偏见。 但是为了显示你应该使用NumberFormat类。 这门课将照顾不同货币金额的本地化问题。 但是NumberFormat只接受原语。 所以使用最后一个,如果你可以接受小的精度变化的双倍。

您不应该使用货币的小数types。 使用整数types。 这保持了准确性购买避免与浮动相关的舍入误差

当显示一个金额,然后除以适当的因素得到非积分部分。