我们在Ubuntu9.04上使用的是MySql 5.0。完整版本为: 5.0.75-0ubuntu10
我创建了一个测试数据库。里面还有一张测试台。我看到以下insert语句的输出:
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...or中的小数位数/精度设置似乎有问题,我是否遗漏了什么?
更新:
找到了我们要插入的一个数字的边界,代码如下:
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> 发布于 2009-05-22 15:49:08
面对手掌!
浮点数是存储为尾数和指数的32位数字。我不能100%确定MySql将如何划分存储空间,但以Java为例,他们将24位用于有符号尾数,8位用于指数(科学记数法)。这意味着一个浮点数可以有的最大值是+8388608*10^127,最小值是-8388608*10^127。这意味着只有7位有效数字,而我的浮点型定义使用了8位。
我们将把所有这些8,2转换为双精度浮点数。
发布于 2009-05-22 15:38:42
MySQL文档提到"MySQL在存储值时执行舍入“,我怀疑这就是这里的问题所在。我复制了您的问题,但将存储类型更改为双精度:
CREATE TABLE test (val, DOUBLE);检索到的值与您提供的测试值相匹配。
无论如何,我的建议是使用双精度或小数。我使用以下命令尝试了相同的原始测试:
CREATE TABLE test (val, DECIMAL(8,2));它检索了我给它的值: 858147.11。
https://stackoverflow.com/questions/898454
复制相似问题