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

时间:2018-07-05 18:42:52

标签: mysql floating-point range

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

1 个答案:

答案 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.htmlhttps://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

也请参阅我关于此的旧推文: https://twitter.com/billkarwin/status/347561901460447232

enter image description here