存储统计数据,我需要 DECIMAL、FLOAT 还是 DOUBLE?

Posted

技术标签:

【中文标题】存储统计数据,我需要 DECIMAL、FLOAT 还是 DOUBLE?【英文标题】:Storing statistical data, do I need DECIMAL, FLOAT or DOUBLE? 【发布时间】:2013-10-26 01:53:18 【问题描述】:

我创作是为了好玩,但我仍然想认真对待它,这是一个托管各种测试的网站。我希望通过这些测试收集统计数据。

某些数据将包括测试完成时间的百分比。我可以轻松计算测试的百分比,但我希望返回真实数据,因为我存储了与完成测试有关的各种不同值。

大多数值都是 php 浮点数,所以我的问题是,如果我想要真正的统计数据,我应该将它们存储在 mysql 中作为 FLOAT、DOUBLE 还是 DECIMAL。

我想使用 MYSQL 的函数,例如 AVG()LOG10() 以及 TRUNCATE()。为了让 MYSQL 根据我插入的值返回真实数据,我应该使用什么作为数据库列选择。

我问是因为有些数字可能是也可能不是浮点数,例如 10、10.89、99.09 或简单的 0。 但我希望返回真实有效的统计数据。

我可以依靠浮点数学吗?

编辑

我知道这是一个笼统的问题,我深表歉意,但对于像我这样的非数学家,我也不是 MYSQL 专家,我希望得到该领域专家的意见。

我已经完成了我的研究,但我仍然觉得我对这件事有一个模糊的判断。如果我的问题离题或不适合本网站,我再次道歉。

【问题讨论】:

【参考方案1】:

link 很好地解释了您要查找的内容。内容如下:

所有这三种类型,都可以通过以下参数(大小,d)指定。其中 size 是 String 的总大小,d 表示精度。例如,要存储像 1234.567 这样的数字,您需要将数据类型设置为 DOUBLE(7, 3),其中 7 是总位数,3 是小数点后的位数。

FLOAT 和 DOUBLE,都表示浮点数。 FLOAT 用于单精度,而 DOUBLE 用于双精度数字。从 0 到 23 的精度会产生一个 4 字节的单精度 FLOAT 列。从 24 到 53 的精度会产生一个 8 字节的双精度 DOUBLE 列。 FLOAT 精确到小数点后 7 位,DOUBLE 精确到 14 位。

Decimal 的声明和作用类似于 Double。但是浮点值和十进制(数字)值之间存在很大差异。我们使用 DECIMAL 数据类型来存储精确的数值,我们不需要精确但精确和准确的值。 Decimal 类型最多可存储 65 位,小数点后 30 位。

因此,对于最准确和最精确的值,十进制将是最佳选择。

【讨论】:

那个链接有很多不正确的信息。我不会听从它的建议。 另外,如果用于索引或作为键,浮点数是不可取的,因为存储的值可能与插入的值不同 我知道这是一个老问题,但为了未来读者的利益,这个答案是完全错误的,不应该被接受。 float, double , 和 decimal 都是 不精确浮点 类型。正如this much better answer 中所解释的,它们之间的主要区别在于基础数据表示的数字基数(2 vs. 10)。 @DavidZhang 您链接到的答案是针对.NET decimal、float 等。这个问题是在询问 MYSQL @SvetAngelov 是的,MySQL DECIMAL 与 .NET decimal 的不同之处在于它是定点而不是浮点。当我说它们都是浮点数时,我在之前的评论中说错了。但这并不能改变所有三种数据类型本质上不精确的事实,在它们之间进行选择意味着选择您愿意容忍的不精确类型【参考方案2】:

除非您存储十进制数据(即货币),否则您应该使用标准浮点类型(FLOAT 或 DOUBLE)。 DECIMAL 是定点类型,所以在计算 SUM 之类的东西时可能会溢出,并且对于 LOG10 会非常不准确。

二进制浮点类型没有什么“不那么精确”的了,事实上,它们会更准确(更快)满足您的需求。选择 DOUBLE。

【讨论】:

在文档中提到,“对于 Decimal ”数据类型的计算是精确的。dev.mysql.com/doc/refman/5.7/en/precision-math-numbers.html 虽然定点值的总和是精确的,但其他运算(例如除法或 log10)则不能:根本无法以定点表示结果。 你能给我指出一个资源,在那里我可以准备更多关于它的信息,无论我在哪里读过它,所写的只是,精确计算使用十进制类型。 任何体面的数值分析(我最喜欢的是 Nick Higham 的“数值算法的准确性和稳定性”)都将涵盖定点和浮点表示。 会看看!【参考方案3】:

十进制:定点类型(精确值)。当您关心金钱等精确度时,请使用它。

示例:salary DECIMAL(8,2),8 为总位数,2 为小数位数。 salary 将在 -999999.99999999.99 的范围内


Float、Double:浮点类型(近似值)。 Float 用 4 个字节表示值,Double 用 8 个字节表示值。

示例:percentage FLOAT(5,2),与十进制类型相同,5 为总位数,2 为小数位数。 percentage 将存储 -999.99999.99 之间的值。

请注意,它们是近似值,在这种情况下:

1 / 3.0 = 0.3333333... 之类的值将存储为 0.33(小数点后两位) 33.009 等值将存储为 33.01(四舍五入到小数点后 2 位)

【讨论】:

【参考方案4】:

简单地说,浮点数和双精度数不如十进制精确。十进制建议用于与金钱相关的数字输入。(货币和工资)。 需要指出的另一点是:不要使用“=”,“”比较浮点数,因为浮点数不精确。

【讨论】:

【参考方案5】:

Linger:您提到和引用的网站包含 IMO 一些不准确的信息,这让我感到困惑。在我读到的文档中,当您声明浮点数或双精度数时,小数点实际上不包含在数字中。所以它不是字符串中的字符数,而是使用的所有数字。

比较文档: "DOUBLE PRECISION(M,D).. 这里,"(M,D)" 表示最多可以存储 M 位数的值,其中 D 位数可能在小数点之后。例如,定义的列因为 FLOAT(7,4) 在显示时看起来像 -999.9999" http://dev.mysql.com/doc/refman/5.1/en/floating-point-types.html

还有误导性的命名法 - 根据文档:M 是“精度”,D 是“比例”,而网站将“比例”用于“精度”。

认为如果像我这样的人试图拍照会很有用。 如果我错了,请纠正我,希望我没有阅读过一些过时的文档:)

【讨论】:

【参考方案6】:

Float 和 Double 是浮点数据类型,这意味着它们存储的数字只能精确到一定位数。 例如对于具有浮点类型列的表,如果您存储7.6543219,它将存储为7.65432。 同样,Double 数据类型近似值,但它比 Float 具有更高的精度。

在创建具有Decimal 数据类型列的表时,您指定要存储的总位数和小数点后的位数,如果您存储的数字在您指定的范围内,它将完全存储.

当您想要存储精确值时,Decimal 是一种选择,它就是所谓的固定数据类型。

【讨论】:

以上是关于存储统计数据,我需要 DECIMAL、FLOAT 还是 DOUBLE?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的float和decimal类型有啥区别

MySQL的float和decimal的区别疑问

decimal

SqlServer中decimal(numeric )float 和 real 数据类型的区别[转]

“decimal”是啥类型的MySQL?

sqlserver中的小数类型(float和decimal)