MySQL(MariaDB)浮点可视化:为什么值四舍五入到数百或数千?
第一:我是MySql的新手,看起来我错过了一些重要的东西 在MySQL数据库中,我的浮点值从单位到数十亿不等。 我花了好几天的时间试图理解为什么所有的数字都不超过6个有效数字,而低有效数字设置为0: i、 e:MySQL(MariaDB)浮点可视化:为什么值四舍五入到数百或数千?,mysql,floating-accuracy,Mysql,Floating Accuracy,第一:我是MySql的新手,看起来我错过了一些重要的东西 在MySQL数据库中,我的浮点值从单位到数十亿不等。 我花了好几天的时间试图理解为什么所有的数字都不超过6个有效数字,而低有效数字设置为0: i、 e: select `field` from `table`; (instead of X -> i get Y) 1 -> 1 12 -> 12 123 -> 123 1234 -> 1234 12345 -> 12345 1234
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规范近似),但我需要技巧。。。我错过了什么
有24位或FLOAT
(超过7)位,具有重要意义:log10(224)
以12345678.910
的形式存储在101111000110001101112
中。当显示为十进制时,客户机肯定知道从第8位开始的所有内容都是绝对的(因为FLOAT
只能存储7位精度的十进制数字)。因此,它将丢弃剩余部分,留给您浮点
12345680
- 双精度
有53位,或DOUBLE
(几乎16)位,具有重要意义:log10(253)
存储在12345678.910
双精度
中,如
(即10111100011001001110.1110011001100110011012
)。当显示为十进制时,客户机肯定知道从第16位开始的所有内容都是绝对的(因为12345678.90000003710
只能存储15位精度的十进制数字)。因此,它将丢弃剩余部分,留给您DOUBLE
12345678.9000000
+0.0
时,MySQL首先将浮点值转换为双精度值
FLOAT
有24位或log10(224)
(超过7)位,具有重要意义:12345678.910
以101111000110001101112
的形式存储在FLOAT
中。当显示为十进制时,客户机肯定知道从第8位开始的所有内容都是绝对的(因为浮点
只能存储7位精度的十进制数字)。因此,它将丢弃剩余部分,留给您12345680
双精度DOUBLE
有53位,或log10(253)
(几乎16)位,具有重要意义:12345678.910
存储在双精度中,如10111100011001001110.1110011001100110011012
(即12345678.90000003710
)。当显示为十进制时,客户机肯定知道从第16位开始的所有内容都是绝对的(因为DOUBLE
只能存储15位精度的十进制数字)。因此,它将丢弃剩余部分,留给您12345678.9000000
当添加+0.0
时,MySQL首先将FLOAT
转换为DOUBLE根据IEEE754,我忽略了FLOAT和DOUBLE的表示,这就是这个谜的解决方案
浮点(32位)的尾数为23位(800万个可能值=>6个有意义的数字),其他9位用于符号和指数。
DOUBLE(64位)的尾数为52位(一些4.5e15可能的值=>14个有意义的数字)
这意味着Mysql不能显示不存在的内容(在我的例子中是浮点数),并用零填充“随机”无意义的数字 根据IEEE754,我忽略了float和double的表示,这就是这个谜的解决方案
浮点(32位)的尾数为23位(800万个可能值=>6个有意义的数字),其他9位用于符号和指数。
DOUBLE(64位)的尾数为52位(一些4.5e15可能的值=>14个有意义的数字)
这意味着Mysql不能显示不存在的内容(在我的例子中是浮点数),并用零填充“随机”无意义的数字 您能否显示一个完整的MySQL会话,例如,从表创建到数据选择,复制/粘贴一个完整的MySQL会话?甚至可以用a来演示输出格式是否允许演示此问题?@eggyal,下面是一个最小的示例:从ID6开始,结果四舍五入到6个有意义的密码。问题是默认情况下使用“select*”时,我通常会看到舍入值,而不是实际值。。。我假设有一个命令将db设置为使用“real”值,但我无法理解开发人员选择这种奇怪的值的原因。只是在SQLfiddle上尝试过:使用double而不是float非常有效。@RyanVincent,我可以想象这种行为与小数位数有关,但我发现,即使更改一个数字的整数端,默认情况下也只保留6个有意义的密码,这令人震惊。我对Mysql的了解很少(我的错,我相信这在每一本Mysql的书中都有提到),但我可以假设有很多像我这样的新手没有发现他们使用的数据是完全错误的。@RyanVincent,我看了一下IEEE754,浮点数的尾数太短了,无法表示超过6个精确数字。您能否显示一个完整的MySQL会话,例如,从表创建到数据选择,复制/粘贴一个完整的MySQL会话?甚至可以用a来演示输出格式是否允许演示此问题?@eggyal,下面是一个最小的示例:从ID6开始,结果四舍五入到6个有意义的密码。问题是默认情况下使用“select*”时,我通常会看到舍入值,而不是实际值。。。我假设有一个命令将db设置为使用“real”值,但无法理解w