我了解建议使用BigDecimal来表示Java中的货币值的最佳实践。你用什么?您是否有更喜欢使用的更好的库?
我了解建议使用BigDecimal来表示Java中的货币值的最佳实践。你用什么?您是否有更喜欢使用的更好的库?
Answers:
BigDecimal
一路走来。我听说有些人创建自己的类Cash
或Money
用货币封装现金值的类,但在表皮下仍然是BigDecimal
,可能是BigDecimal.ROUND_HALF_EVEN
四舍五入。
编辑:正如唐在他的回答中提到的那样,有timeandmoney之类的开源项目,尽管我赞扬它们试图防止开发人员不得不重新发明轮子,但我对使用pre-alpha库没有足够的信心它在生产环境中。此外,如果您在引擎盖下四处挖掘,也会发现它们也使用BigDecimal
过。
对于通过搜索引擎到达此处的人来说,了解JodaMoney可能会有用:http : //www.joda.org/joda-money/。
BigDecimal
在引擎盖下!
我在这里没有表达我的观点,但是有很多反对BigDecimal的论点,有人可能会抛出:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/
我之前遇到的一个方便的库是Joda-Money库。实际上,其实现之一是基于BigDecimal。它基于ISO-4217货币规范,并且可以支持自定义货币列表(通过CVS加载)。
该库中有少量文件,如果需要修改,可以快速浏览。Joda-Money是根据Apache 2.0许可发布的。
如果您仅使用美元和美分,我将使用多头(抵消2个小数位)。如果需要更多详细信息,可以选择大十进制。
无论哪种方式,我都可能将类扩展为具有使用正确格式的.toString(),并作为放置其他可能出现的其他方法的地方(长期以来,如果十进制为小数,则乘法和除法会出错没有调整)
另外,如果使用定义自己的类和接口,则可以随意替换实现。
BigDecimal
或其他定点表示形式通常是金钱所需要的。
浮点(Double
,Float
)表示和计算是不精确的,从而导致错误的结果。
在处理时间和金钱时,您必须非常小心。
希望您在赚钱时,每个人都应该知道永远不要使用浮动或双倍。
但是我不确定BigDecimal。
在大多数情况下,如果您只跟踪整数或整数,就可以了。这样,您永远不会处理小数位。
打印时只显示美元。始终使用内部整数使用美分。如果需要除法或需要使用Math.abs(),这可能会很棘手。
但是,您可能只关心百分之一,甚至百分之一。我不知道这样做的好方法。您可能只需要处理千分之一美分并使用很长时间。否则,您可能会被迫使用BigDecimal
我会在这方面做更多的阅读,但请忽略开始谈论使用浮点数或双精度表示货币的每个人。他们只是在找麻烦。
我觉得我的建议还不完善,因此请多加建议。您正在处理危险类型!
有一个更好的图书馆,时间和金钱。IMO,它远远超过了JDK提供的代表这两个概念的库。
嘿,这是一篇有关BigDecimal的非常有趣的文章,并举例说明了为什么有时使用它而不是使用double。BigDecimal教程。
最终显示货币值时,可以使用DecimalFormat类。它提供了本地化支持,并且可以扩展。
总会涉及到约束和细节。任何没有足够经验的人都不能理解下一篇文章中概述的细微问题,在处理实际财务数据之前,应该认真考虑一下:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money
BigDecimal几乎不是唯一正确的表示形式或难题的唯一组成部分。在特定条件下,使用以美分作为整数存储的Money类就足够了,并且比BigDecimal快得多。是的,这意味着要使用美元作为货币和限额,但是这种约束对于许多用例是完全可以接受的,而且所有货币对于舍入和子面额都有特殊情况,因此没有“通用”解决方案。