我正在构建这个API,数据库将存储代表以下之一的值:
- 百分比
- 平均数
- 比率
老实说,我不知道如何用数字表示范围在0到100%之间的内容。应该是
- 0.00-1.00
- 0.00-100.00
- 我不知道的其他任何替代方案
有没有明确的选择? 全球通用的数据库表示0到100%的方式是什么? 此外,它的正确类型是float还是decimal?
谢谢。
我正在构建这个API,数据库将存储代表以下之一的值:
老实说,我不知道如何用数字表示范围在0到100%之间的内容。应该是
有没有明确的选择? 全球通用的数据库表示0到100%的方式是什么? 此外,它的正确类型是float还是decimal?
谢谢。
范围“0.00-100.00”可以使用FLOAT
和输出格式化,或者使用DECIMAL(5,2)
(3字节)进行处理,并预先确定您始终需要指定的精度。
float
)。浮点数是以二进制表示数字的,这导致某些(精确的)数字在运算或比较时会被四舍五入,因为它们无法准确地以二进制进行存储。这可能导致出现令人惊讶的行为。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 |
| --: |
使用二进制比较数字1.3
会失败,这很棘手。
相比之下,十进制提供了其范围内有限数字的准确表示。如果在上述示例中将float
更改为decimal(2, 1)
,则可以得到预期结果。
如果您要以与显示相同的方式存储数据,我建议使用decimal(5,2)
,因为decimal
可以保留精确度。(请参见https://dev.mysql.com/doc/refman/8.0/en/fixed-point-types.html)
由于浮点数是近似值,而不是精确值,因此在比较中试图将它们视为精确值可能会导致问题。它们也受平台或实现依赖性的影响。
(https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html)
在SQL语句中写入的浮点数值可能与内部表示的值不同。对于DECIMAL列,MySQL使用65位小数精度执行操作,这应该解决大多数常见的不准确问题。https://dev.mysql.com/doc/refman/8.0/en/problems-with-float.html
十进制数: 在金融应用中,最好使用十进制类型,因为它可以提供高精度并且容易避免舍入误差。
双精度浮点数: 双精度浮点数是除了处理货币之外最常用的实数数据类型。
单精度浮点数: 它主要用于图形库中,因为需要很高的处理能力,并且用于可以容忍舍入误差的情况。
浮点数和十进制数之间的区别在于精度。在十进制格式的精度范围内,十进制数可以100%准确地表示任何数字,而浮点数不能准确地表示所有数字。
对于与财务相关的值,请使用十进制数;对于图形相关的值,请使用浮点数。
0.5 -> 50%
。mysql> create table numbers (a decimal(10,2), b float);
mysql> insert into numbers values (100, 100);
mysql> select @a := (a/3), @b := (b/3), @a * 3, @b * 3 from numbers \G
*********************************************************************
@a := (a/3): 33.333333333
@b := (b/3): 33.333333333333
@a + @a + @a: 99.999999999000000000000000000000
@b + @b + @b: 100
在这些情况下,十进制小数正好做到了它应该做的事情,截断了其余部分,因此失去了1/3的部分。
所以对于求和,十进制小数更好,但对于除法,浮点数更好,当然,在某个程度上是这样。我的意思是,使用DECIMAL不能以任何方式给您“失误防护算术”。
希望这能有所帮助。