mysql - 浮点类型比较

标签 mysql sql floating-point

我插入了 pi 的差异值(见下文):

3.14 
3.1415 
3.14159
3.14159265359 

我看不出不同浮点类型处理相同值的方式有何不同。

代码:

mysql> select * from test_types;
+---------+---------+---------+----------+
| flo     | dub     | deci    | noomeric |
+---------+---------+---------+----------+
| 3.14000 | 3.14000 | 3.14000 |  3.14000 |
| 3.14150 | 3.14150 | 3.14150 |  3.14150 |
| 3.14159 | 3.14159 | 3.14159 |  3.14159 |
| 3.14150 | 3.14150 | 3.14150 |  3.14150 |
| 3.14159 | 3.14159 | 3.14159 |  3.14159 |
+---------+---------+---------+----------+
5 rows in set (0.00 sec)

mysql> describe test_types;
+----------+---------------+------+-----+---------+-------+
| Field    | Type          | Null | Key | Default | Extra |
+----------+---------------+------+-----+---------+-------+
| flo      | float(10,5)   | YES  |     | NULL    |       |
| noomeric | decimal(10,5) | YES  |     | NULL    |       |
| deci     | decimal(10,5) | YES  |     | NULL    |       |
| dub      | double(10,5)  | YES  |     | NULL    |       |
+----------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

我可以在这里看到,在创建表时,数字类型的字段使用了 DECIMAL(请参阅 describe 命令表)。

有人知道一个显示 FLOAT、DECIMAL 和 DOUBLE 之间差异的示例吗?

最佳答案

FLOATDOUBLE 用于非常小的值或非常大的值。

本质上它们是相同的东西(除了存储大小不同 FLOAT 4 字节和 DOUBLE 8 字节,参见 Data Type Storage Requirements )

关于它们的主要问题是它们是近似值(参见 quoted from Oracle website ):

Because floating-point values are approximate and not stored as exact values, attempts to treat them as exact in comparisons may lead to problems. They are also subject to platform or implementation dependencies.

DECIMAL 允许精确表示,但您的 DECIMAL 列不能很好地用于 PI 的原因是因为您只允许 5 位小数,但后来您输入了它11 位小数。

将 PI 值精确到小数点后 11 位的最佳存储方式类似于 DECIMAL(12,11)

有关将值存储为 DECIMAL 与将相同值存储并用作 FLOAT 不同的实际示例,请参见下文:

CREATE TABLE decimal_vs_float_test
( dec DECIMAL(12,11)
, fl FLOAT
);

INSERT INTO decimal_vs_float_test VALUES
  ( 3.947947949 , 3.947947949 )
 ,( 3.777777777 , 3.777777777 )
 ,( 3.555555555 , 3.555555555 )
 ,( 3.333333333 , 3.333333333 )
 ,( 3.111111111 , 3.111111111 ) 
 ;

SELECT * FROM decimal_vs_float_test WHERE fl = dec

现在您可以看到对 DECIMALFLOAT 的值进行了不同的处理。

希望对您有所帮助。

此外,FLOATDOUBLE 是浮点二进制小数点类型,而 DECIMAL 是浮点小数点类型。

参见 this answer有关这意味着什么的更确切的详细信息,类型的编码方式之间的区别以及何时最好使用哪种类型(它适用于 C#,但它仍然很有趣)。

关于mysql - 浮点类型比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14621873/

相关文章:

c# - 显示每个请求的所有 linq sql 查询

mysql - 无法创建预期的查询

c - C 中使用实数变量的关系运算符

python - 在 Python 中舍入一个数字但保持结尾为零

mysql - 每分钟给出日期,每两提取一次

php - 如果日期晚于

php - 直接从 Android 手机将图像存储在服务器中

mysql - docker下迁移mysql5/laravel 5报错Specified key was too long

c# - SQL 中未使用的字符/字符组合

python - 如何在Python中正确处理浮点运算?