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

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

一些数据将包括testing完成时间的百分比。 我可以很容易地计算出testing的百分比,但是我想要返回真实的数据,因为我在testing完成时存储了各种不同的值。

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

我想利用MYSQL的function,如AVG()LOG10()以及TRUNCATE() 。 为了让MYSQL返回基于我插入的值的真实数据,我应该使用什么作为数据库列的select。

我问,因为一些数字可能会或可能不是像10,10.89,99.09,或者简单的0浮点数。但是我想真实有效的统计数据被返回。

我能依靠浮点math吗?

编辑

我知道这是一个普遍的问题,我对此深表歉意,但对于像我这样的非math家,我也不是MYSQL的专家,我想请一个专家在这个领域的意见。

我已经做了研究,但是我仍然觉得我对这个问题的判断很混乱。 我再次道歉,如果我的问题是脱离主题或不适合本网站。

这个链接很好的解释你在找什么。 这是说什么:

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

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

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

因此,为了获得最准确和最精确的值,Decimal将是最好的select。

简单地说,浮点数和双精度不如小数点精确。 (货币和工资)推荐使用小数。 还有一点需要指出的是:不要使用“=”,“<>”比较浮点数,因为浮点数不精确。

除非你存储十进制数据(即货币),否则应该使用标准的浮点types(FLOAT或DOUBLE)。 DECIMAL是一个固定点types,所以在计算像SUM这样的东西的时候可能会溢出,而对于LOG10来说,这样会变得不可靠。

二进制浮点types没有什么“不太精确”,事实上,它们会更准确(更快),以满足您的需求。 去DOUBLE。

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

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

也是误导性的术语 – 按照文档:M是'精确',D是'规模',而网站'精确'的'规模'。

以为这样会有用像我这样的人想要得到一张照片。 纠正我,如果我错了,希望我没有读过一些过时的文档:)

十进制 :定点types( 准确值)。 当你关心像金钱一样精确的精确度时使用它。

例如: salary DECIMAL(8,2) ,8是总位数,2是小数位数。 salary范围在-999999.99999999.99


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

例如: percentage FLOAT(5,2) ,与十进制types相同,5是总数字,2是小数位数。 percentage将存储在-999.99999.99之间的值。

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

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