在使用ScriptEngine过程中,发现存在结果精度丢失的问题,如下图:
可以看到,参与求和的各个数值都是小数点后两位,怎么能保持这个精度呢?另外,我试了Jexl和Aviator这两个引擎,都存在这种问题。
在使用ScriptEngine过程中,发现存在结果精度丢失的问题,如下图:
可以看到,参与求和的各个数值都是小数点后两位,怎么能保持这个精度呢?另外,我试了Jexl和Aviator这两个引擎,都存在这种问题。
浮点数计算有精度问题,用Math.round四舍五入下
float和double类型主要是为了科学计算和工程计算而设计的。他们执行二进制浮点运算,这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,它们并没有提供完全精确的结果,所以不应该被用于需要精确结果的场合。float和double类型尤其不是和用于货币计算,因为要让一个float或者double精确地标识0.1(或者10的任何其他负数次方值)是不能的。
1、对于任何需要精确答案的计算任务,请不要使用float或者double。
2、如果你想让系统来记录十进制小数点,并且不介意因为不使用基本类型而带来的不便,就请使用BigDecimal。使用BigDecimal还有一些额外的好处,他允许你完全控制舍入,每当一个操作涉及舍入的时候,他允许你从8种舍入模式中选择其一。如果你正通过法定要求的舍入行为进行业务计算,使用BigDecimal是非常方便的。
3、如果性能非常关键,并且你不介意自己记录十进制小数点,而且所涉及的数值又不太大,就可以使用int或者long。如果数值范围内没有超过9位十进制数字,就可以使用int;如果不超过18位数字,就可以使用long。如果数值可能超过18位数字,就必须使用BigDecimal。