我已在java网站上阅读使用BigDecimal
作为货币。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
但是我们应该使用哪种舍入模式?这是最合适的,也是最广泛的我们
答案 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)
您绝不应对货币使用小数类型。使用整数类型。这样可以保持准确性,避免与浮动相关的舍入错误
当显示金额然后除以适当的因子以得到非整数部分。