如何在mysql中正确使用float类型?

Yal*_*ber 6 mysql floating-point range

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

Bil*_*win 5

这完全按照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 |
+--------------+
Run Code Online (Sandbox Code Playgroud)

如果要存储更大的值,请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

在此处输入图片说明