4

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

2 回答 2

11

面对手掌!!!!

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

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

于 2009-05-22T15:49:08.307 回答
2

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

CREATE TABLE test (val, DOUBLE);

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

对于它的价值,我的建议是使用 DOUBLE 或 DECIMAL。我尝试了相同的原始测试:

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

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

于 2009-05-22T15:38:41.913 回答