阅读Postgresql 关于数字数据类型会引出以下问题:为什么在Postgresql中使用数据类型Float (SQL标准)和Numeric获得这些意外的结果?
例如:
CREATE TEMP TABLE testnum (a numeric, b float);
INSERT INTO testnum VALUES (100,100);
INSERT INTO testnum VALUES (9*9*9,9*9*9);
INSERT INTO testnum VALUES (9^9^9,9^9^9);
SELECT (a/3)*3 AS numeric, (b/3) * 3 AS float FROM testnum;
SELECT (a/5)*5 AS numeric, (b/5) * 5 AS float FROM testnum;那就跑
SELECT (a/3)*3 AS numeric, (b/3) * 3 AS float FROM testnum;
numeric | float
99.9999999999999999 | 100
729.0000000000000000 | 729在这个测试中,Float看起来比Numeric更精确。
哪一种数据类型适合精确的数值,如货币或库存数量?
发布于 2020-10-28 21:46:29
您正在成为隐式类型转换的牺牲品。当其中一个操作数为numeric,另一个操作数为integer时,整数操作数将被转换为numeric,其结果将是numeric。由于numeric具有严格定义的精度,试图在小数点( 100/3生成的小数点之后)为它赋值无穷多位数的值,不加舍入,将导致截断。同样的逻辑也适用于乘法,其中一个操作数现在不是33.333.(无限序列为"3"s),这似乎是你所期望的,而是一个定义精度的numeric 33.333.3(“3”S的有限序列),它自然产生99.999.9-一个有限序列。
当其中一个操作数为float,另一个操作数为integer时,整数操作数将被转换为float,其结果将是float。由于float具有近似精度,它可以处理33.333.还有99.999..。不同的是,这最终导致了大约100的值。
至于
哪一种数据类型适合精确的数值,如货币或库存数量?
手册给出了你所需要的确切答案:
如果需要精确的存储和计算(例如货币金额),则使用数字类型。
它没有提到的是,您应该通过使用适合您的业务规则的显式类型转换和舍入来控制每一步的计算。
https://dba.stackexchange.com/questions/278828
复制相似问题