存储统计数据,我需要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.99
至999999.99
浮点,双精度 :浮点types( 近似值 )。 Float用4个字节表示值,Double用8个字节表示值。
例如: percentage FLOAT(5,2)
,与十进制types相同,5是总数字,2是小数位数。 percentage
将存储在-999.99
到999.99
之间的值。
请注意,它们是近似值 ,在这种情况下:
-
1 / 3.0 = 0.3333333...
将被存储为0.33
(小数点后两位) - 像
33.009
这样的33.009
将被存储为33.01
(四舍五入到小数点后两位)