假设我在Java中有一个代表金钱的小数值。
绕过这些值的最佳方法是什么?
例如,如果我有一个基于税率计算的值,并且我最终会得到5.3999999999999995
作为税额的结果,那么我应该将其四舍五入到小数点后两位这样:
double d = 5.3999999999999995
BigDecimal bd = new BigDecimal(d).setScale(2, RoundingMode.HALF_EVEN);
d = bd.doubleValue();
生成货币值:
5.40
答案 0 :(得分:7)
大多数计算资金的应用程序都不使用浮点数(double
,float
);它们使用代表较小单位的整数。例如,在美元中,货币可以用便士表示,即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
更适合于该任务,因为它可以完全按预期表示小数部分。