用Java表示货币值

2020/12/07 02:52 · java ·  · 0评论

我了解建议使用BigDecimal来表示Java中的货币值的最佳实践。你用什么?您是否有更喜欢使用的更好的库?

BigDecimal一路走来。我听说有些人创建自己的CashMoney类,这些类类用货币封装了现金值,但在表皮下仍然是BigDecimal,可能是BigDecimal.ROUND_HALF_EVEN四舍五入。

编辑:正如Don在他的回答中提到的那样,有timeandmoney之类的开源项目,尽管我赞扬它们试图防止开发人员不得不重新发明轮子,但我只是对使用pre-alpha库没有足够的信心它在生产环境中。此外,如果您在引擎盖下四处挖掘,也会发现它们也使用BigDecimal

对于通过搜索引擎到达此处的人来说,了解JodaMoney可能会很有用:http : //www.joda.org/joda-money/

我在这里没有表达我的意见,但是有很多反对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 或其他定点表示形式通常是金钱所需要的。

浮点(DoubleFloat)表示和计算是不精确的,从而导致错误的结果。

在处理时间和金钱时,您必须非常小心。

希望您在赚钱时,每个人都应该知道永远不要使用浮动或双倍。

但是我不确定BigDecimal。

在大多数情况下,如果您只跟踪整数或整数,就可以了。这样,您永远不会处理小数位。

打印时只显示美元。始终使用内部整数使用美分。如果需要除法或需要使用Math.abs(),这可能会很棘手。

但是,您可能只关心百分之一,甚至百分之一的钱。我不知道这样做的好方法。您可能只需要处理千分之一美分并使用很长时间。否则,您可能会被迫使用BigDecimal

我会在这方面做更多的阅读,但是请忽略开始谈论使用浮点数或双精度表示货币的每个人。他们只是在自找麻烦。

我觉得我的建议还不完善,因此请多加建议。您正在处理危险类型!

创建Money类是必经之路。在下面使用BigDecimal(甚至是int)。然后使用Currency类定义舍入约定。

不幸的是,如果没有运算符重载,Java会使创建此类基本类型变得非常不愉快。

有一个更好的图书馆,时间和金钱IMO,它远远优于JDK提供的代表这两个概念的库。

绝对不是BigDecimal。舍入和表示有很多特殊规则,您需要担心。

马丁·福勒(Martin Fowler)建议实现专用的Money类来表示货币金额,并且还应实现货币换算的规则。

嘿,这是一篇有关BigDecimal的非常有趣的文章,并提供了一个示例性示例,说明了为什么有时使用它而不是使用double。BigDecimal教程

最终显示货币值时,可以使用DecimalFormat类。它提供了本地化支持,并且可以扩展。

正如上面提到的,我将BigDecimal封装在Money类中,该类也具有一种货币。重要的是您要进行大量的单元测试,尤其是在使用其他货币时。如果添加一个方便的构造函数(采用字符串)或执行相同操作的工厂方法,以便编写类似以下内容的测试,这也是一个好主意:

   assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));

总会有涉及的限制和细节。任何没有足够经验的人都不能理解下一篇文章中概述的细微问题,在处理实际财务数据之前,应认真考虑一下:

http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money

BigDecimal几乎不是唯一正确的表示形式或难题的唯一组成部分。在某些条件下,使用以美分作为整数存储的Money类就足够了,并且比BigDecimal快得多。是的,这意味着要使用美元作为货币和限额,但是对于许多用例来说,这样的约束条件是完全可以接受的,而且所有货币对于舍入和子面额都有特殊情况,因此没有“通用”解决方案。

本文地址:http://java.askforanswer.com/yongjavabiaoshihuobizhi.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!