3

我有一个包含 Double(9,8) 列的表。当我尝试在该列中插入来自 PHP 的值 10 时,我最终得到 9.99999999。

我可以理解舍入错误,但首先这是一个整数。任何帮助表示赞赏:)

4

5 回答 5

11

Double(9,8)方法:

  • 总共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。

于 2013-10-09T08:12:23.750 回答
4

这是 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
于 2013-10-09T08:24:19.187 回答
0

http://dev.mysql.com/doc/refman/5.6/en/problems-with-float.html

如果需要精度,请使用小数

另外,double(9, 8) 表示最大值为 9,99999999

于 2013-10-09T08:16:12.377 回答
0

从文档中:

DOUBLE PRECISION(M,D) - 这里,“(M,D)”表示数值最多可以存储 M 位,其中 D 位可能在小数点后。例如,定义为 FLOAT(7,4) 的列在显示时看起来像 -999.9999

您需要将更高的值添加到M

于 2013-10-09T08:12:45.063 回答
0

逗号后的每个数字都是您在逗号后输入的金额。一个奇怪的句子,但肯定是一个正确的句子。

这就是我在数据库中设置密钥的方式。

于 2013-10-09T08:24:32.617 回答