我目前正在开发 ERP(企业资源规划)系统,需要决定用于处理应用程序内的计算和其他数值的数据类型。
我知道 Java 提供了几种处理十进制数的选项,例如 BigDecimal 和 Double。我知道每种选项都有自己的优点和缺点,但我想确保选择最合适的选项来保持系统的精度和效率。
以下是我需要应用计算的一些具体情况:
- 账单和付款:处理价格、税金、折扣等。
- 工资和会计:
- 库存管理:包括单价和产品成本。
我倾向于使用 BigDecimal 进行财务操作,因为它的精度较高,但我担心它会影响性能。另一方面,Double 在速度方面可能更高效,但可能会引入舍入误差。
对于在 ERP 中处理这些情况,您有什么建议?在什么情况下最好使用 BigDecimal,什么时候使用 Double?有什么模式或最佳实践我应该遵循吗?
避免使用浮点数来赚钱
浮点技术以牺牲准确性来换取执行速度。
在 Java 中,原始类型
float
和double
是浮点类型。它们的包装类Float
和也是Double
。切勿在精度很重要的地方使用这些。也就是说,切勿为了赚钱。使用
BigDecimal
整数相反,必须采用以下方法之一来处理零碎金额:
BigDecimal
对象。这种类型比浮点数慢得多,但准确。当然,语法比数字文字更笨拙。但好处是,除了准确性之外,您还可以获得Banker's Rounding等方便的方法。long
)。要将美元精确到十分之一美分,乘以一千可表示密尔(₥)。零钱种类表
float
&double
1.23d
new BigDecimal( "1.23" )
int
&long
long cents = new Double( 1.23d * 100 ).longValue() ;
cents
或mills
。)Money money = Money.parse("USD 23.87") ;
对于所有与金钱相关的计算,如果不使用 ,那就太粗心了
BigDecimal
。请使用 进行BigDecimal
所有计算。如果不这样做会发生什么?在执行任何类型的数学运算时,
double
/的精度不准确Double
都会导致错误的结果。错误的结果可能会让您的公司损失金钱、信誉和时间来纠正错误的计算。性能很可能不会成为问题。仅在出现性能问题时才解决它们,不要针对不存在的问题进行预先优化。
BigDecimal:用于所有精度至关重要的财务计算(账单、付款、工资单、会计)。
原因:
Double:用于非财务计算、大规模数据处理以及可以接受轻微精度损失的性能关键部分。
这里的关键是,当数字直接影响财务结果时使用 BigDecimal,而当处理性能至关重要且可以容忍轻微的精度损失的大型数据集时使用 Double。