我正在创造乐趣,但我仍然想认真对待它,一个主持各种测试的网站。通过这些测试,我希望收集统计数据。
部分数据将包括测试完成程度的百分比。我可以轻松地计算测试的百分比,但我希望返回真实数据,因为我存储了有关完成时测试的各种不同值。
大多数值都是在PHP浮点数中,所以我的问题是,如果我想要真正的统计数据,我应该将它们存储在MYSQL中,如FLOAT,DOUBLE或DECIMAL。
我想利用MYSQL的功能,例如AVG()
和LOG10()
以及TRUNCATE()
。为了让MYSQL根据我插入的值返回真实数据,我应该使用什么作为数据库列选择。
我问,因为有些数字可能是浮点数,例如10,10.89,99.09,或者只是0。 但我想要返回真实有效的统计数据。
我可以依靠浮点数学吗?
修改
我知道这是一个通用的问题,我为此深表歉意,但对于像我这样的非数学家,我也不是MYSQL专家,我希望得到该领域专家的意见。
我已经完成了我的研究,但我仍然觉得我对这个问题有一个阴云密布的判断。如果我的问题不合适或不适合本网站,我再次道歉。
答案 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.99
到999999.99
浮动,双重:浮点类型(近似值)。 Float使用4个字节表示值,Double使用8个字节表示值。
示例:percentage FLOAT(5,2)
,与十进制类型相同,5是总数,2是小数位。 percentage
会将值存储在-999.99
到999.99
之间。
请注意,它们是近似值,在这种情况下:
1 / 3.0 = 0.3333333...
之类的值将存储为0.33
(小数点后2位)33.009
之类的值将存储为33.01
(四舍五入至小数点后两位)答案 4 :(得分:1)
比较文档: “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
是一种解决方法,它就是所谓的固定数据类型。