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

时间:2013-10-26 01:53:18

标签: mysql floating-point double decimal

我正在创造乐趣,但我仍然想认真对待它,一个主持各种测试的网站。通过这些测试,我希望收集统计数据。

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

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

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

我问,因为有些数字可能是浮点数,例如10,10.89,99.09,或者只是0。 但我想要返回真实有效的统计数据。

我可以依靠浮点数学吗?

修改

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

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

6 个答案:

答案 0 :(得分:76)

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位,并且最多可达14位。

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

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

答案 1 :(得分:6)

除非您要存储十进制数据(即货币),否则应使用标准浮点类型(FLOAT或DOUBLE)。 DECIMAL是一个定点类型,因此在计算像SUM这样的东西时会溢出,对LOG10来说会非常不准确。

关于二进制浮点类型没有“不太精确”,事实上,它们将更加准确(和更快)满足您的需求。选择DOUBLE。

答案 2 :(得分:5)

简单地说,Float和double不如十进制精确。建议使用小数作为货币相关数字输入。(货币和工资)。 需要指出的另一点是:不要使用" =","<>"来比较浮点数,因为浮点数不精确。

答案 3 :(得分:3)

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

示例:salary DECIMAL(8,2),8是总位数,2是小数位数。 salary将在-999999.99999999.99

的范围内

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

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

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

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

答案 4 :(得分:1)

灵儿:你提到的网站引用了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

这也是误导性的命名 - 符合docs:M是'精确'而D是'scale',而网站则采用'scale'来表示'精确'。

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

答案 5 :(得分:0)

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

在创建具有Decimal数据类型的列的表时,您指定要存储的总位数和十进制后的位数,如果存储的位数在指定范围内,则将完全存储。

要存储精确值时,Decimal是一种解决方法,它就是所谓的固定数据类型。