在计算机中十进制小数转化为二进制数算法是乘以2直到没有了小数为止,所以有些小数不能准确表示类似十进制中无法用小数准确表示1/3.
计算机是通过二进制进行运算的,首先需要把double类型的小数转化为二进制然后再加起来.
0.05 、0.15、 0.1等转为二进制时都出现了无限循环,就好像十进制中无法精确表示1/3一样,出现了精度的损失.
神通的浮点数 float 用的就是硬件计算方式,那么小数点最后几位必然是不精准的,所以计算结果是一个0的近似值
oracle 没有float类型,所谓的 float 类型是映射到 number ,number 类型存储以及计算方式是oracle自己做的,用的并不是计算机硬件。
oracle 存在 BINARY_FLOAT和BINARY_DOUBLE 类型,这两个类型是根据IEEE754实现单精度和双精度浮点型,同样的bug数据,oracle输出结果与神通一致。