`
羽落窗前
  • 浏览: 105763 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

关于float的精准问题原因

 
阅读更多

最近在整理关于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)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics