gpt4 book ai didi

mysql - 浮点类型比较

转载 作者:行者123 更新时间:2023-11-29 06:52:24 32 4
gpt4 key购买 nike

我插入了 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com