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

PEP*_*OVE 63 mysql floating-point double decimal

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

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

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

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

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

我可以依靠浮点数学吗?

编辑

我知道这是一个普遍的问题,我道歉,但对于像我这样的非数学家,我也不是MYSQL专家,我想对这个领域的专家提出意见.

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

Lin*_*ger 79

链接可以很好地解释您要查找的内容.这是说什么:

所有这三种类型都可以通过以下参数(大小,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位小数,并且DOUBLE高达14位.

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

因此,对于最准确和最精确的值,Decimal将是最佳选择.

  • 该链接有很多不正确的信息.我不会听从它的建议. (11认同)
  • 我知道这是一个老问题,但是为了未来读者的利益,**这个答案是完全错误的,不应该被接受.**`float`,`double`和`decimal`都是*不精确的浮动 - 点*类型.正如[这个更好的答案](/sf/answers/43301751/)中所解释的,它们之间的主要区别是底层数据表示的*数字基*(2对10). (8认同)
  • 此外,如果用于索引或作为键,则不希望使用浮点数,因为存储的值可能与插入的值不同 (3认同)
  • @DavidZhang 您链接的答案适用于 .NET 十进制、浮点数等。这个问题是关于 MYSQL (2认同)

Tim*_*ess 10

十进制:定点类型(精确值)。当您像金钱一样关心精确度时使用它。

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


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

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

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

  • 值 like1 / 3.0 = 0.3333333...将存储为0.33(小数点后两位)
  • 值 like33.009将存储为33.01(四舍五入到小数点后两位)


Sim*_*rne 6

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

关于二进制浮点类型没有什么"不太精确",事实上,它们将更准确(和更快)满足您的需求.与DOUBLE一起去.


小智 5

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