你应该用什么舍入方法在Java中用钱?

时间:2011-05-05 21:01:01

标签: java rounding currency

假设我在Java中有一个代表金钱的小数值。

绕过这些值的最佳方法是什么?

例如,如果我有一个基于税率计算的值,并且我最终会得到5.3999999999999995作为税额的结果,那么我应该将其四舍五入到小数点后两位这样:

double d = 5.3999999999999995
BigDecimal bd = new BigDecimal(d).setScale(2, RoundingMode.HALF_EVEN);
d = bd.doubleValue();

生成货币值:

5.40

4 个答案:

答案 0 :(得分:7)

大多数计算资金的应用程序都不使用浮点数(doublefloat);它们使用代表较小单位的整数。例如,在美元中,货币可以用便士表示,即1/100美元。

为了获得更好的准确性,您可能希望得到一个代表1E-03(“毫美元”)或1E-06的整数。这取决于诸如利息计算和您的精确度等问题。

答案 1 :(得分:3)

我同意@Laurent Pireyn的说法,你应该根据合同来解决问题。例如,IRS可以将您舍入到最接近的美元。他们说

  

你可以将分数整齐到整数   退货后的美元。如果你这样做   圆到全币,你必须圆   所有金额。圆形,下降量   低于50美分并增加金额   从50到99美分到下一个   美元。例如,1.39美元变为1美元   和2.50美元成为3美元

很好地使用RoundingMode.HALF_EVEN。这样就无需编写和测试函数。

如果这实际上是美国国税局的税率,我认为RoundingMode.HALF_UP是正确的。

答案 2 :(得分:1)

金钱通常是使用“圆一半甚至”规则(也称为“银行家的四舍五入”)来舍入。它表示通过选择最接近的偶数数字来打破关系。这可以显示为消除对正值和负值进行四舍五入的偏差。(这不是唯一具有此属性的舍入规则,但在处理货币时它是一个不错的属性。)

我不认为此规则在标准API中可用,尽管编写代码并不困难。

答案 3 :(得分:1)

您已经使用BigDecimal进行四舍五入,您已经使用了非常适合财务应用程序的舍入模式,除非有特定的要求或法规禁止其他人使用。

您唯一必须做的就是采取最后一步,并使用BigDecimal来表示整个申请中的金钱价值。这正是它的用途,它比double更适合于该任务,因为它可以完全按预期表示小数部分。