CREATE TABLE test_double2(f1 DOUBLE);
INSERT INTO test_double2 VALUES(0.47),(0.44),(0.19);
SELECT SUM(f1) FROM test_double2;
#sun(f1) 为1.099999999999 原本 0.47+0.44+0.19 = 1.1
为什么float和double会有精度误差?
知识:MySQL用4个存储存储float类型,用 8 个字节来存储 double类型数据。都是用二进制方式进行存储。当我们明白小数转二进制后就会知道,如果尾数不是 0 或 5(比如 0.47),你就无法用一个二进制数来精确表达。进而,就只好在取值允许的范围内进行四舍五入。
所以: 在编程中,如果用到浮点数,要特别注意误差问题,因为浮点数是不准确的,所以我们要避免使用“=”来判断两个数是否相等。同时,在一些对精确度要求较高的项目中,千万不要使用浮点数,不然会导致结果错误,甚至是造成不可挽回的损失。建议使用MySQL精确的数据类型,顶点数据类型:DECIMAL 。
小数如何转换为二进制:
--将小数部分乘以2,整数部分作为二进制第一位,再将小数部分乘以2,将整数部分作为二进制第二位,一直到小数部分为0。当除不尽就会进行截取,所以这是出现误差的原因。
比如 0.6 表示为二进制
0.6*2 = 1.2 1 0.2 * 2 = 0.4 0 0.4*2 = 0.8 0 0.8*2 = 1.6 1 0.6*2 = 1.2 1 0.2*2 = 0.4
如果是 10.6 的话用二进制表示为 1010.1001 1001 1001......