我插入了 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 之间差异的示例吗?
最佳答案
FLOAT 和 DOUBLE 用于非常小的值或非常大的值。
本质上它们是相同的东西(除了存储大小不同 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
现在您可以看到对 DECIMAL 或 FLOAT 的值进行了不同的处理。
希望对您有所帮助。
此外,FLOAT 和 DOUBLE 是浮点二进制小数点类型,而 DECIMAL 是浮点小数点类型。
参见 this answer有关这意味着什么的更确切的详细信息,类型的编码方式之间的区别以及何时最好使用哪种类型(它适用于 C#,但它仍然很有趣)。
关于mysql - 浮点类型比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14621873/