浮点类型比较

时间:2013-01-31 09:00:06

标签: mysql sql floating-point

我插入了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之间差异的例子吗?

1 个答案:

答案 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#,但仍然有趣)。