我有一个包含 Double(9,8) 列的表。当我尝试在该列中插入来自 PHP 的值 10 时,我最终得到 9.99999999。
我可以理解舍入错误,但首先这是一个整数。任何帮助表示赞赏:)
Double(9,8)
方法:
这是数字的格式:
0.00000000
所以你可以通过输入10得到最接近的是9.9999999
从MySQL 文档:
MySQL 允许使用非标准语法:FLOAT(M,D) 或 REAL(M,D) 或 DOUBLE PRECISION(M,D)。这里,“(M,D)”表示总共最多可以存储M 位的值,其中 D 位可能在小数点之后。例如,定义为 FLOAT(7,4) 的列在显示时看起来像 -999.9999。MySQL 在存储值时执行舍入,因此如果将 999.00009 插入 FLOAT(7,4) 列,则近似结果为 999.0001。
这是 MySQL 使用数据丢失作为特征方法的典型示例。如果你强化 SQL 模式,你可以避免它(我绝对推荐):
mysql> CREATE TABLE foo (
-> bar DOUBLE(9,8)
-> );
Query OK, 0 rows affected (0.08 sec)
传统模式具有数据丢失功能:
mysql> SET sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO foo (bar) VALUES (10);
Query OK, 1 row affected, 1 warning (0.06 sec)
mysql> SELECT bar FROM foo;
+------------+
| bar |
+------------+
| 9.99999999 |
+------------+
1 row in set (0.00 sec)
严格模式不会:
mysql> SET sql_mode='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO foo (bar) VALUES (10);
ERROR 1264 (22003): Out of range value for column 'bar' at row 1
http://dev.mysql.com/doc/refman/5.6/en/problems-with-float.html
如果需要精度,请使用小数
另外,double(9, 8) 表示最大值为 9,99999999
从文档中:
DOUBLE PRECISION(M,D) - 这里,“(M,D)”表示数值最多可以存储 M 位,其中 D 位可能在小数点后。例如,定义为 FLOAT(7,4) 的列在显示时看起来像 -999.9999
您需要将更高的值添加到M
逗号后的每个数字都是您在逗号后输入的金额。一个奇怪的句子,但肯定是一个正确的句子。
这就是我在数据库中设置密钥的方式。