4种databases (PMSO) 在精度计算中的问题解决

4种databases (PMSO) 在精度计算中的问题解决

1  Oracle 中的计算,不同的位置的计算会造成最终的结果不同的问题,请见下图

4种databases (PMSO) 在精度计算中的问题解决

2 官方给出的解答是,直接计算会返回不具有IEEE 754 方式的四舍五入的浮点算法。

3 官方推荐的正确计算方式是,添加 to_number的方式,来进行相关的数值计算后,
在进行四舍五入的计算,这样获得的值,则不会像上面一样,会有different values 的
存在。

4种databases (PMSO) 在精度计算中的问题解决

4 这样的问题在 SQL SERVER 中存在不存在,答案是存在,并且更难搞
首先我们照搬上面的计算,图中很清楚的看到,结果和ORACLE 不同如初一辙

4种databases (PMSO) 在精度计算中的问题解决

我们按照惯性思维的方式,我们用ORACLE 同样的方式来处理看看结果怎么样

4种databases (PMSO) 在精度计算中的问题解决

结果和ORACLE 不同,即使使用双精度的数字进行计算还是造成计算顺序不同,而值不同的情况,

则解决的方法有两个

方法1  多添加保留位,在图中我们可以看到,结果是一致的,但我想很多开发的同学都不大会满意

4种databases (PMSO) 在精度计算中的问题解决

方法2 使用menoy类型来进行变换,结果是一致的

4种databases (PMSO) 在精度计算中的问题解决

那如果此种情形发生在MYSQL 数据库中呢?
同样 MYSQL 中存在同样的问题

4种databases (PMSO) 在精度计算中的问题解决

这里MYSQL的处理方式稍微不同,虽然我们添加了 decimal 但如果还是保留2位小数,则结果还是不对,这里比需要的值多保留一位,则结果就一致了。

4种databases (PMSO) 在精度计算中的问题解决

最后,PostgreSQL 怎么来进行下面的事情

在众多的数据库中,只有POSTGRESQL 给出了事情的真相,顺序不同计算的结果是不同的

4种databases (PMSO) 在精度计算中的问题解决

在Postgresql 中可以通过类似MYSQL 的方式进行计算等式的修改后,两种计算获得同样的计算结果

4种databases (PMSO) 在精度计算中的问题解决

或许还有更多的方法,如果有还请不吝赐教