提问人:Alex Poca 提问时间:6/7/2016 最后编辑:Alex Poca 更新时间:6/8/2016 访问量:1661
MySQL(MariaDB)浮点可视化:为什么值四舍五入到数百或数千?
MySQL (MariaDB) float visualization: why are values rounded to hundreds or thousands?
问:
第一:我是MySql新手,看起来我在这里遗漏了一些重要的东西。
在MySQL数据库中,我的浮点值范围从单位到数十亿。 我花了几天时间试图理解为什么它们都显示不超过 6 个有效数字,而不太有效的数字设置为 0:
即:
select `field` from `table`;
(instead of X -> i get Y)
1 -> 1
12 -> 12
123 -> 123
1234 -> 1234
12345 -> 12345
123456 -> 123456
1234567 -> 1234570
12345678 -> 12345700
123456789 -> 123457000
只有通过一个“技巧”,我才能在某个地方找到可以读取实际值的地方:
select `field`+0.0 from `table`;
我的问题:这种(恕我直言)奇怪行为背后的基本原理是什么?文档中在哪里描述了它? 我发现完全不直观,我看不到正常选择*的真实值(当然是根据IEEE规范近似的),但我需要这个技巧......我在这里错过了什么?
答:
A 有 24 位或(超过 7 位)具有重要意义:存储在 a 中 as (这是 )。当显示为十进制时,客户端可以肯定地知道从第 8 位开始的所有内容都绝对是错误的精度(因为 a 只能存储 7 位十进制精度)。因此,它会丢弃其余部分,留下 .
FLOAT
log10(224)
12345678.910
FLOAT
1011110001100001010011112
1234567910
FLOAT
12345680
A 有 53 位,或(几乎 16 位)具有重要意义:存储在 a as 中(即 )。当显示为十进制时,客户端可以肯定地知道从第 16 位开始的所有内容都绝对是错误的精度(因为 a 只能存储 15 位十进制精度)。因此,它会丢弃其余部分,留下 .
DOUBLE
log10(253)
12345678.910
DOUBLE
101111000110000101001110.111001100110011001100110011012
12345678.9000000003710
DOUBLE
12345678.9000000
添加时,MySQL首先将 up 转换为 .+0.0
FLOAT
DOUBLE
评论
FLOAT
根据IEEE754,我忽略了浮点数和双精度的表示,这就是这个谜团的答案。
FLOAT(32 位)的尾数为 23 位(8 百万个可能值 => 6 个有意义的数字),其他 9 位用于符号和指数。 DOUBLE(64 位)的尾数为 52 位(一些 4.5e15 可能的值 => 14 个有意义的数字)。
这意味着 Mysql 无法显示不存在的东西(在我的情况下是 FLOAT 大数字)并用零填充“随机”没有意义的数字。
评论