MySQL(MariaDB)浮点可视化:为什么值四舍五入到数百或数千?

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

第一:我是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
  123456 -> 123456
  1234567 -> 1234570
  12345678 -> 12345700
  123456789 -> 123457000
只有通过一个“技巧”,我才能在某个地方读到真正的值:

select `field`+0.0 from `table`;
我的问题:这种奇怪行为背后的原因是什么?文档中的描述在哪里? 我发现完全不直观,我看不到正常选择的真实值(当然根据IEEE规范近似),但我需要技巧。。。我错过了什么

  • 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
    有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