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


74

我创建游戏的目的很有趣,但我仍然想认真对待它,它是一个托管各种测试的网站。通过这些测试,我希望收集统计数据。

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

大多数值都是PHP浮点数,所以我的问题是,如果我想要真实的统计数据,应该将它们以FLOAT,DOUBLE或DECIMAL的形式存储在MYSQL中。

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

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

我可以依靠浮点运算吗?

编辑

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

我已经进行了研究,但我仍然对此事有模糊的判断。再次抱歉,我的问题不在主题范围内或不适合该网站。

Answers:


89

链接很好地解释了您要寻找的内容。这是说的:

所有这三种类型都可以通过以下参数(大小,d)指定。其中size是字符串的总大小,而d表示精度。例如,要存储类似1234.567的数字,请将数据类型设置为DOUBLE(7,3),其中7是数字的总数,而3是跟随小数点的数字。

FLOAT和DOUBLE都代表浮点数。FLOAT用于单精度,而DOUBLE用于双精度数字。从0到23的精度导致4字节单精度FLOAT列。从24到53的精度将导致8字节的双精度DOUBLE列。FLOAT精确到小数点后7位,双精度最多14位。

小数的声明和功能类似于Double。但是浮点值和十进制(数字)值之间有一个很大的区别。我们使用DECIMAL数据类型来存储精确的数值,在此我们不需要精度,而是想要精确的值。十进制类型最多可以存储65位数字,小数点后可以有30位数字。

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


11
该链接有很多不正确的信息。我不会听从它的建议。
西蒙·伯恩

另外,如果用于索引编制或用作键,
则不

11
我知道这是一个古老的问题,但是为了将来的读者,这个答案是完全错误的,不应被接受。 floatdoubledecimal都是不精确的浮点类型。正如这个更好的答案所解释的,它们之间的主要区别是基础数据表示的数字基数(2与10)。
张大卫

1
@DavidZhang您链接到的答案是.NET十进制,浮点等。这个问题是关于MYSQL的
Svet Angelov

1
@SvetAngelov是的,MySQLDECIMAL与.NET的不同之处decimal在于它是定点而不是浮点。当我说它们都是浮点数时,我在先前的评论中打错了话。但是,这并不能改变一个事实,这三个数据类型是固有的不精确,以及它们之间的选择就是选择了一种不精确的你愿意忍受。
张大卫

10

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

关于二进制浮点类型,没有什么“不够精确”的,实际上,它们将满足您的需求(并且更快)。加倍。


在文档中提到“对于Decimal”数据类型,计算是精确的。dev.mysql.com/doc/refman/5.7/en/precision-math-numbers.html
达克士

1
尽管定点值的求和是精确的,但其他操作(例如除法或log10)却不可以:根本无法用定点表示结果。
西蒙·伯恩

您能否将我指向一个资源,无论我在何处读到它,都可以准备更多有关它的内容,所写的只是为了精确计算使用Decimal类型。
达克什

1
数值分析的任何不错的报道(我最喜欢的是Nick Higham的“数值算法的准确性和稳定性”)都将涵盖定点和浮点表示形式。
西蒙·伯恩

会看看吧!
Daksh

8

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

示例:salary DECIMAL(8,2),8是数字总数,2是小数位数。salary将在范围内-999999.99,以999999.99


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

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

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

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

6

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


1

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是“比例”,而网站将“比例”表示为“精度”。

认为这样对我这样的人很有用。如果我错了,请纠正我,希望我没有读一些过时的文档:)


0

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

当创建具有一列Decimal数据类型的表时,可以指定要存储的总位数和十进制后的位数,并且如果存储的位数在指定范围内,则将精确存储该位数。

当您要存储精确值时,Decimal这就是所谓的固定数据类型。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.