Ama*_*ari 16 mysql sql floating-point types decimal
我正在构建这个 API,数据库将存储代表以下之一的值:
老实说,我不知道如何表示范围在 0 到 100% 之间的数字。应该是
对此有明确的选择吗?在数据库上表示从 0 到 100% 百分比的全局方式?更进一步,它的正确类型是什么,浮点数还是十进制数?
谢谢你。
我会采取相反的立场。
FLOAT用于近似数字,例如百分比、平均值等。您应该在显示值时进行格式化,无论是在应用程序代码中还是使用FORMAT()MySQL的功能。
永远不要测试float_value = 1.3;失败的原因有很多。
DECIMAL应该用于货币价值。 DECIMAL当值需要四舍五入为美元/美分/欧元/等时,避免第二次四舍五入。会计师不喜欢零头。
MySQL 的实现DECIMAL允许 65 位有效数字;FLOAT给出大约 7 和DOUBLE大约 16。7 通常对于传感器和科学计算来说已经足够了。
至于“百分比”——有时TINYINT UNSIGNED当我只想消耗1个字节的存储并且不需要太多精度时使用;有时我用过FLOAT(4 个字节)。没有专门针对百分比调整的数据类型。(另请注意,这DECIMAL(2,0)不能保存 value 100,因此从技术上讲,您需要DECIMAL(3,0).)
或者有时我使用了FLOAT一个介于 0 和 1 之间的值。但是我需要确保在显示“百分比”之前乘以 100。
更多的
“百分比、平均、比率”这三个都闻起来像漂浮物,所以这将是我的第一选择。
决定数据类型的一个标准...将存在多少个值副本?
如果您有一个十亿行的表,其中有一列用于百分比,请考虑这TINYINT将占用 1 个字节(总共 1GB),但FLOAT会占用 4 个字节(总共 4GB)。OTOH,大多数应用程序没有那么多行,所以这可能不相关。
作为“一般”规则,“精确”值应使用某种形式的INTor DECIMAL。不精确的东西(科学计算、平方根、除法等)应该使用FLOAT(或DOUBLE)。
此外,输出的格式化通常应该留给应用程序前端。也就是说,即使“平均值”可以计算为“14.6666666...”,但显示应该显示类似“14.7”的内容;这对人类更友好。同时,您具有稍后决定“15”或“14.667”是更可取的输出格式的基础值。
范围 "0.00 - 100.00" 既可以FLOAT 使用输出格式,也可以使用DECIMAL(5,2)(3 bytes)并预先确定您将始终需要指定的 precision。
我通常建议不要使用float. 浮点数确实表示以 2 为基数的数字,这会导致某些(精确的)数字在运算或比较中向上舍入,因为它们无法准确地以 2 为基数存储。这可能会导致令人惊讶的行为。
考虑以下示例:
create table t (num float);
insert into t values(1.3);
select * from t;
| num |
| --: |
| 1.3 |
select * from t where num = 1.3;
| num |
| --: |
Run Code Online (Sandbox Code Playgroud)
数字的 Base-2 比较1.3失败。这很棘手。
相比之下,十进制可以准确表示其范围内的有限数字。如果您在上面的示例中更改float为,您确实会得到预期的结果。decimal(2, 1)