【问题标题】:MySql FLOAT datatype and problems with more then 7 digit scaleMySql FLOAT 数据类型及超过 7 位刻度的问题
【发布时间】:2010-10-28 06:15:23
【问题描述】:

我们在 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> 

【问题讨论】:

  • 我实际上在运行 5.0.67 MySQL 的 Windows 机器上得到 858147.13。

标签: mysql rounding mysql-5.0


【解决方案1】:

掌心!!!

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

我们要将所有这些 8,2 从 FLOAT 转换为 DOUBLE。

【讨论】:

    【解决方案2】:

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

    CREATE TABLE test (val, DOUBLE);
    

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

    我的建议是使用 DOUBLE 或 DECIMAL。我尝试了相同的原始测试:

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

    它检索到我给它的值:858147.11。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多