我插入了pi的diff值(见下文):
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之间差异的例子吗?
答案 0 :(得分:2)
FLOAT 和 DOUBLE 适用于非常小的值或非常大的值。
基本上它们是相同的(除了存储大小FLOAT 4字节与DOUBLE 8字节不同,请参阅Data Type Storage Requirements)
关于他们的主要问题是他们是近似的(见quoted from Oracle website):
因为浮点值是近似值而不是精确存储 价值,试图在比较中对待它们可能会导致 问题。它们也受平台或实施的约束 的依赖关系。
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
现在,您可以看到以不同方式处理 DECIMAL 或 FLOAT 的值。
希望有所帮助。
此外, FLOAT 和 DOUBLE 是浮动二进制点类型,而 DECIMAL 是浮动小数点类型。
有关这意味着什么的更详细的详细信息,请参阅this answer,类型编码方式与何时最好使用哪种类型(它适用于C#,但仍然有趣)。