最近在整理关于MYSQL预定义词的笔记,然后发现了一个经常被提到的问题,float的精准度。
在MYSQL的官方文档里,有这样一个例子:
select (.1+.2)=.3
=> 1
但是
select (.1e0 + 0.2e0) = .3e0
=> 0
在自己的mysql上试了一下,果然如此,这是为什么呢,于是我试了一下
select .1e0 + 0.2e0
=> 0.30000000000000004
根据浮点数的表达规则 长度float=S+E+M=1+8+23=32, double=1+11+52=64
(S: 区分正【0】负【1】数, E:10的几次幂,M:数值)
计算方法参考=>here
因为select 1.e0 + 0.2e0中定义了E=0,所以,
在float格式下:
0.1 的M部分是 0.0001 1001 1001 1001 1001 100
0.2 的M部分是 0.0011 0011 0011 0011 0011 001
相加的结果是 0.0100 1100 1100 1100 1100 101
0.3 的M部分是 0.0100 1100 1100 1100 1100 110
而在不定义E的情况下,根据这个里面的解说:
0.1 的S = 0
小数部分是:0.0001 1001 1001 ....
也就是:1.1001 1001... * 10-4
而根据第一位必须是1的原理,M中不存储第一个1
M的值是:1001 1001 1001 1001 1001 100
所以,最后还原出:
0.1 = 0.0001 1001 1001 1001 1001 1001 100
0.2 = 0.0011 0011 0011 0011 0011 0011 00
相加 = 0.0100 1100 1100 1100 1100 1100 100
03 = 0.0100 1100 1100 1100 1100 1100 1 ( = 0.1 + 0.2)
分享到:
相关推荐
float piefloat pie float pie float pie float pie
C语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 FLOATC语言头文件 ...
float
将4字节转float类型和将float型转4字节
python实现,将float数据转换成二进制数据;
字节位数和float型转换小工具,可实现双向转换,占容小,速度快捷
float转16进制 10 16进制转换
matlab中的 tofloat函数,库函数中没有,自己定义才有
float转byte数组测试小工具
将浮点数转ASCII码,已测试,可正常使用。
float2hex浮点数转换工具.rar
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit
float字节序高低位转换.txt
此小工具功能:实现不同OS下的float类型值转换内存值功能,能够计算float在内存中的记录值,有助于排查float类型传输过程中的问题。
16进制转float,float转16进制的c语言代码,用的机器内自转
4BYTE字节转换成float型数据代码
java写的byte转float值IEEE标准
CSS浮动属性Float详解 什么是CSS Float?
16进制转成float 或double类型数据的一个小工具。
可以很好地实现16进制与float的相互转换