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 |
+--------------+
1条答案
按热度按时间q43xntqr1#
这完全符合
FLOAT(10,7)
. 如果给定的值与位数不匹配,则会对该值设置上限,并使用可以匹配的最大值。在本例中,10位数的值为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位在小数点的右边。
如果要存储较大的值,请声明
FLOAT
有足够的数字来保存您使用的值。例如,可以将值1196.104插入到FLOAT(11,7)
或者FLOAT(10,6)
.或者你可以用
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