我在mysql中有一个表,其字段类型为float(10,7)。 我正在尝试插入值1196.104,即使使用phpmyadmin时,它也会将该值转换为1000.0000000。 我应该使用哪种类型将值1196.104正确存储在数据库中。
答案 0 :(得分:2)
这完全符合FLOAT(10,7)
的预期。如果您提供的数字值不适合位数,则会将其设置为上限,并使用可容纳的最大值。
在这种情况下,十位数字999.9999999会四舍五入为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.html和https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
也请参阅我关于此的旧推文: https://twitter.com/billkarwin/status/347561901460447232