对于java应用程序,在处理金钱时使用BigDecimal安全吗,还是应该使用整数并为金钱创建一个抽象?

对于java应用程序,在处理金钱时使用BigDecimal安全吗,还是应该使用整数并为金钱创建一个抽象?,java,rounding,currency,bigdecimal,Java,Rounding,Currency,Bigdecimal,我已经有一段时间没有写过处理金钱的应用程序了。很多年前,我会制作一个在幕后处理整数的money对象。无论何时,只要在某处打印出金额,它就会将小数点放在正确的位置。这是为了防止十进制问题 我还需要这样做吗,还是可以只使用BigDecimal?目前认为最佳做法是什么?这取决于您的要求。您可能只需要解析到最接近的K(例如,招聘网站上的薪资要求) 假设您的意思是需要粒度,那么BigDecimal似乎非常适合这项工作。使用它看起来确实“安全”,但如果不知道您打算用它做什么,很难说清楚。这取决于您的需求。您

我已经有一段时间没有写过处理金钱的应用程序了。很多年前,我会制作一个在幕后处理整数的money对象。无论何时,只要在某处打印出金额,它就会将小数点放在正确的位置。这是为了防止十进制问题


我还需要这样做吗,还是可以只使用BigDecimal?目前认为最佳做法是什么?

这取决于您的要求。您可能只需要解析到最接近的K(例如,招聘网站上的薪资要求)


假设您的意思是需要粒度,那么BigDecimal似乎非常适合这项工作。使用它看起来确实“安全”,但如果不知道您打算用它做什么,很难说清楚。

这取决于您的需求。您可能只需要解析到最接近的K(例如,招聘网站上的薪资要求)


假设您的意思是需要粒度,那么BigDecimal似乎非常适合这项工作。它的使用似乎确实“安全”,但由于不知道您打算用它做什么,很难说清楚。

旁注,但我一直很好奇(从未真正处理过):对于金钱来说,
double
真的不安全吗?我不敢相信舍入错误会发生在分数级别。。。有人会介意共享一个计算的例子,其中<代码>双 s将是危险的吗?@ Mehrdad考虑的情况是,你有一个不能用浮点精确表示的小数。如果这个小数被表示为比期望值小的最高值,那么比较(
balance@glowcoder:但是你就不能说
Math.abs(balance-spendingCost)@Mehrdad:我在金融部门工作。Double可以用来计算“过去一个月这只股票的平均价格是多少?”.但如果我们使用double进行会计核算,我们会通过任何客户尽职调查测试。加法不好,但减法更糟糕。你的想法总是四舍五入到小数点后两位(当然,你忘了共同基金头寸四舍五入到四位,等等)实际上是使用了一个笨拙的大整数移位表示法。这是一个已解决的问题。不要用浮点进行计算。请注意,但我一直对此很好奇(从未真正处理过)“代码>双< /代码>实际上是不安全的钱吗?我不能相信舍入错误会发生在分级别……有人介意共享一个计算的例子吗?<代码>双 S将是危险的?@ Mehrdad考虑一个情况,你有一个小数,不能用浮点精确表示。al被表示为比期望值小的最高值,这是一个比较(
balance@glowcoder:但是你就不能说
Math.abs(balance-spendingCost)@Mehrdad:我在金融业工作。Double可以用来计算“过去一个月这只股票的平均价格是多少?”.但如果我们使用double进行会计核算,我们会通过任何客户尽职调查测试。加法不好,但减法更糟糕。你的想法总是四舍五入到小数点后两位(当然,你忘了共同基金头寸四舍五入到四位,等等)真的是使用了一个笨拙的BigInteger移位两位表示法。这是一个解决了的问题。不要用浮点计算。众所周知,使用普通的double即使加起来也会有简单的数学问题。这是不可接受的。我很好奇你是否遇到了与BigDecimal相同的问题。这没什么大不了的使用int-我可以。我不太在乎。但是如果我可以通过使用BigDecimal简化代码,我真的希望这样。节省时间。BigDecimal的唯一目的是避免“那些问题”就像我说的,在一般情况下,是的,我会说这很好。但有可能你正在做一些BigDecimal还没有准备好处理的事情。BigDecimal对我头脑中想到的每一个货币应用程序都很好。好吧,众所周知,使用普通的双精度将有简单的数学问题,即使是加法。这是不可接受的。我很好奇你是否遇到了与BigDecimal相同的问题。使用int没有什么大不了的-我可以。我不太在乎。但是如果我可以通过使用BigDecimal简化我的代码,我真的希望如此。节省时间。提供BigDecimal的唯一目的是避免“那些问题”就像我说的,在一般情况下,是的,我会说这很好。但有可能你正在做一些BigDecimal还没有准备好处理的事情。BigDecimal对我头脑中想到的每一个货币应用程序都很好。