首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Postgresql中浮点数和数值有什么区别?

在Postgresql中浮点数和数值有什么区别?
EN

Database Administration用户
提问于 2020-10-28 20:18:04
回答 1查看 6.4K关注 0票数 5

阅读Postgresql 关于数字数据类型会引出以下问题:为什么在Postgresql中使用数据类型Float (SQL标准)和Numeric获得这些意外的结果?

例如:

代码语言:javascript
复制
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;

那就跑

代码语言:javascript
复制
SELECT (a/3)*3 AS numeric, (b/3) * 3 AS float FROM testnum;

numeric                                     |         float          
                        99.9999999999999999 |                    100
                       729.0000000000000000 |                    729

在这个测试中,Float看起来比Numeric更精确。

哪一种数据类型适合精确的数值,如货币或库存数量?

EN

回答 1

Database Administration用户

回答已采纳

发布于 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的值。

至于

哪一种数据类型适合精确的数值,如货币或库存数量?

手册给出了你所需要的确切答案:

如果需要精确的存储和计算(例如货币金额),则使用数字类型。

它没有提到的是,您应该通过使用适合您的业务规则的显式类型转换和舍入来控制每一步的计算。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/278828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档