Yal*_*ber 6 mysql floating-point range
我在 mysql 中有一个表,字段类型为 float(10, 7)。我正在尝试插入值 1196.104,即使在使用 phpmyadmin 时,它也会将该值转换为 1000.0000000。我应该使用什么类型将值 1196.104 正确存储在数据库中。
这完全按照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.html和https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
另请参阅我关于此的旧推文:https : //twitter.com/billkarwin/status/347561901460447232