84

我创作是为了好玩,但我仍然想认真对待它,一个承载各种测试的网站。我希望通过这些测试收集统计数据。

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

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

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

我问是因为有些数字可能是也可能不是浮点数,例如 10、10.89、99.09 或简单的 0。但我希望返回真实有效的统计数据。

我可以依靠浮点数学吗?

编辑

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

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

4

6 回答 6

103

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

所有这三种类型,都可以通过以下参数(大小,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 数据类型来存储精确的数值,我们不需要精确但精确和准确的值。Decimal 类型最多可存储 65 位,小数点后为 30 位。

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

于 2013-10-26T02:04:36.043 回答
14

除非您存储十进制数据(即货币),否则您应该使用标准浮点类型(FLOAT 或 DOUBLE)。DECIMAL 是定点类型,因此在计算 SUM 之类的东西时可能会溢出,并且对于 LOG10 会非常不准确。

二进制浮点类型没有什么“不那么精确”的了,事实上,它们会更准确(更快)满足您的需求。与双去。

于 2014-12-09T21:29:02.033 回答
11

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

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


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

示例:percentage FLOAT(5,2),与十进制类型相同,5 为总位数,2 为小数位。percentage将存储 到 之间-999.99的值999.99

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

  • 类似的值1 / 3.0 = 0.3333333...将存储为0.33(小数点后 2 位)
  • 值 like33.009将被存储为33.01(四舍五入到小数点后 2 位)
于 2017-10-14T09:31:49.877 回答
7

简单地说,浮点数和双精度数不如十进制精确。十进制建议用于与金钱相关的数字输入。(货币和工资)。需要指出的另一点是:不要使用“=”,“<>”比较浮点数,因为浮点数并不精确。

于 2014-12-09T20:44:30.560 回答
1

Linger:你提到和引用的网站有 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

还有误导性的命名法 - 根据文档:M 是“精度”,D 是“比例”,而网站将“比例”用于“精度”。

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

于 2014-01-31T13:11:36.913 回答
1

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

创建具有Decimal数据类型列的表时,您指定要存储的总位数和小数点后的位数,如果您存储的数字在您指定的范围内,它将被精确存储。

当您要存储精确值时,Decimal这是一种方法,即所谓的固定数据类型。

于 2018-10-23T00:36:29.630 回答