首页 > 解决方案 > 如何在mysql中正确使用float类型?

问题描述

我在 mysql 中有一个字段类型为 float(10, 7) 的表。我正在尝试插入值 1196.104,即使使用 phpmyadmin,它也会将该值转换为 1000.0000000。我应该使用什么类型将值 1196.104 正确存储在数据库中。

标签: mysqlfloating-pointrange

解决方案


这完全按照FLOAT(10,7). 当您给出一个不适合位数的值时,它会限制该值并使用可以适合的最大值。

在本例中,999.9999999 的 10 位值向上舍入到 1000.0000000。

https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html说:

MySQL 允许使用非标准语法:FLOAT(M,D) 或 REAL(M,D) 或 DOUBLE PRECISION(M,D)。这里,(M,D) 表示最多可以存储 M 位的值,其中 D 位可能在小数点后。

换句话说,给了它在 1000.0000000 处最大化的约束,因为你告诉它在 10 位处最大化,其中 7 位在小数点的右边。

mysql> create table f ( f float(10,7));

mysql> insert into f values (1196.104);
Query OK, 1 row affected, 1 warning (0.02 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1264 | Out of range value for column 'f' at row 1 |
+---------+------+--------------------------------------------+

mysql> select * from f;
+--------------+
| f            |
+--------------+
| 1000.0000000 |
+--------------+

如果您想存储更大的值,FLOAT请使用足够的数字声明以保存您使用的值。例如,值 1196.104 可以插入到FLOAT(11,7)FLOAT(10,6)

或者你可以FLOAT不带参数使用,它根本不会限制位数。

关于 FLOAT 有一些注意事项。它是一个不精确的数字类型,并且会有舍入错误。由于 FLOAT 的实现方式,这是不可避免的,它会影响每一种编程语言。

阅读https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.htmlhttps://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

另请参阅我的旧推文: https ://twitter.com/billkarwin/status/347561901460447232

在此处输入图像描述


推荐阅读