我创建网站是为了好玩,但我还是想认真地去做,这个网站上有各种各样的测试,我希望通过这些测试来收集统计数据。
一些数据将包括测试完成的百分比,因为他们是定时的。我可以很容易地计算测试的百分比,但我希望真正的数据被返回,因为我存储有关测试完成的各种不同的值。
大多数值都是PHP浮点数,所以我的问题是,如果我想要真正的统计数据,我应该把它们存储在MYSQL中作为FLOAT,DOUBLE或DECIMAL。
我想利用MYSQL的函数,如AVG()
和LOG10()
以及TRUNCATE()
。对于MYSQL,要根据我插入的值返回真实数据,我应该使用什么作为数据库列选择。
我这样问是因为有些数字可能是浮点数,也可能不是浮点数,如10、10.89、99.09或0。但我希望返回真实有效的统计数据。
我可以依靠浮点数来实现这一点吗?
编辑
我知道这是一个一般性的问题,我道歉广泛,但对于非数学家喜欢我自己,也不是一个MYSQLMaven,我想在这个领域的Maven的意见。
我已经做了我的研究,但我仍然觉得我有一个模糊的判断问题。再次道歉,如果我的问题是离题或不适合这个网站。
7条答案
按热度按时间wqlqzqxt1#
这个**link**很好地解释了你要找的东西。下面是它说的:
所有这三种类型都可以通过以下参数(size,d)指定。其中size是字符串的总大小,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位。
因此,要获得最准确的值,Decimal是最佳选择。
ar7v8xwq2#
除非您要存储十进制数据(即货币),否则您应该使用标准浮点类型(FLOAT或DOUBLE)。DECIMAL是一种定点类型,因此在计算SUM之类的数据时可能溢出,并且对于LOG10来说会非常不准确。
关于二进制浮点类型没有什么“不精确”的,事实上,它们会更精确(和更快)地满足你的需要。
vlju58qv3#
小数:定点类型(Exact Value)。当您关心精确精度(如金钱)时,请使用它。
示例:
salary DECIMAL(8,2)
,8是总位数,2是小数位数。salary
将在-999999.99
到999999.99
的范围内浮点型,双精度型:浮点类型(* 近似 * 值)。浮点型使用4个字节表示值,双精度型使用8个字节表示值。
示例:
percentage FLOAT(5,2)
,与decimal类型相同,5是总位数,2是小数位数。percentage
将存储-999.99
到999.99
之间的值。注意,它们是近似值,在本例中:
1 / 3.0 = 0.3333333...
的值将存储为0.33
(2位小数)33.009
的值将存储为33.01
(四舍五入到2位小数)s3fp2yjn4#
简单地说,浮点数和双精度数不如小数点精确。建议在输入与货币相关的数字时使用小数点。(货币和工资)。另外需要指出的一点是:不要使用“="、"〈〉"比较浮点数,因为浮点数不精确。
gg58donl5#
玲儿:你提到和引用的网站有一些不精确的信息,让我很困惑。我在文档中看到,当你声明一个浮点数或双精度数时,小数点实际上不包括在数字中。所以它不是字符串中的字符数,而是使用的所有数字。
比较文档:“DOUBLE PRECISION(M,D)..此处,“(M,D)”表示值最多可以存储M位,其中D位可以在小数点之后。例如,定义为FLOAT(7,4)的列在显示”http://dev.mysql.com/doc/refman/5.1/en/floating-point-types.html“时将显示为-999.9999
还有误导性的术语-根据文件:M是“精度”,D是“规模”,而网站则用“规模”来表示“精度”。
我觉得如果像我这样的人想拍张照片的话,这会很有用。如果我说错了,请纠正我,希望我没有读过一些过时的文档:)
gkl3eglg6#
浮点型和双精度型是浮点数据类型,这意味着它们存储的数字最多只能精确到一定的位数。例如,对于包含浮点型列的表,如果存储
7.6543219
,它将存储为7.65432
。同样,Double
数据类型近似值,但它的精度比Float
高。当创建具有
Decimal
数据类型列的表时,指定要存储的总位数和小数点后的位数,如果存储的数字在指定的范围内,则将精确存储该数字。当你想存储精确的值时,
Decimal
是一种可行的方法,它就是所谓的固定数据类型。csbfibhn7#
简单地使用
FLOAT
。不要附加'(m,n)*。用格式选项显示适当精度的数字。不要期望用“="得到正确的答案;例如,float_col = 0.12
将始终返回FALSE
。出于显示目的,请根据需要使用格式对结果进行舍入。
百分比、平均值等都是四舍五入的(至少在某些情况下)。你所做的任何选择有时都会有问题。
货币使用
DECIMAL(m,n)
;整数使用...INT
;其他的都使用DOUBLE for scientific stuff that needs more than 7 digits of precision; use
FLOAT '。超验者(比如你提到的
LOG10
)将在DOUBLE
中完成他们的工作;它们基本上永远不会是精确的。可以给它一个FLOAT
参数并将结果存储在FLOAT
中。这个答案不仅适用于MySQL,而且基本上适用于任何数据库或编程语言。
PS:
(m,n)
已经从FLOAT
和DOUBLE
中删除了。它只增加了额外的舍入和其他本质上没有好处的东西。