1

我插入了 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(请参阅描述命令表)。

请问有谁知道显示浮点数、十进制和双精度之间差异的示例吗?

4

1 回答 1

2

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

本质上它们是相同的(除了存储大小 FLOAT 4 字节与 DOUBLE 8 字节不同,请参阅数据类型存储要求

它们的主要特点是它们是近似的(参见Oracle 网站引述):

因为浮点值是近似值而不是存储为精确值,所以在比较中尝试将它们视为精确值可能会导致问题。它们还受平台或实现依赖关系的影响。

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是浮点小数点类型。

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

于 2013-01-31T09:01:38.987 回答