mysql - 如何在mysql中正确使用float类型?
问题描述
我在 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 |
+--------------+
如果您想存储更大的值,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
推荐阅读
- django - 如何将期刊引用添加到 django 模板
- python - BS4 抓取不返回页面部分
- android - 将我的 ionic 应用程序发布到 Playstore 时,它在许多设备上不可见。但它之前的版本是
- python - 即使提供了可调用的参数
- python - python中的数据表
- ios - 在 Swift 5 中播放声音后获取错误代码而不会崩溃
- html - 如何使用 jquery 获取 DIV 中的全部内容?
- javascript - 通过网络服务连接moodle api
- python - PIL 改变了将 RGB 转换为 L(灰度)的方式?
- c - 带有 fork() 的 C 程序执行两次扫描