代码之家  ›  专栏  ›  技术社区  ›  Gennadiy

MySql浮点数据类型和超过7位数刻度的问题

  •  4
  • Gennadiy  · 技术社区  · 17 年前

    我们在Ubuntu 9.04上使用MySql 5.0。完整版本为:5.0.75-0ubuntu10

    mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> insert into test value(858147.11);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> SELECT * FROM test;
    +-----------+
    | floaty    |
    +-----------+
    | 858147.12 | 
    +-----------+
    1 row in set (0.00 sec)
    

    mySql中设置的比例/精度似乎有问题……或者我遗漏了什么?

    更新:

    找到我们插入的一个数字的边界,以下是代码:

    mysql> CREATE TABLE test (floaty FLOAT(8,2)) engine=InnoDb;
    Query OK, 0 rows affected (0.03 sec)
    
    mysql> insert into test value(131071.01);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> insert into test value(131072.01);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> SELECT * FROM test;
    +-----------+
    | floaty    |
    +-----------+
    | 131071.01 | 
    | 131072.02 | 
    +-----------+
    2 rows in set (0.00 sec)
    
    mysql> 
    
    2 回复  |  直到 17 年前
        1
  •  11
  •   Gennadiy    17 年前

    掌心!!!!

    浮点数是存储为尾数和指数的32位数字。我不是100%确定MySql将如何分割存储,但以Java为例,他们将使用24位表示有符号尾数,8位表示指数(科学符号)。这意味着浮点可以具有的最大值为+8388608*10^127,最小值为-8388608*10^127。这意味着只有7个有效数字,我的浮点定义使用了8。

        2
  •  2
  •   itsmatt    17 年前

    MySQL文档提到“MySQL在存储值时执行舍入”,我怀疑这就是问题所在。我复制了您的问题,但将存储类型更改为双重:

    CREATE TABLE test (val, DOUBLE);
    

    检索到的值与您提供的测试值匹配。

    我的建议是,无论如何,使用双精度或者十进制。我尝试了相同的原始测试:

    CREATE TABLE test (val, DECIMAL(8,2));
    

    它得到了我给它的值:858147.11。