如何向上舍入多位小数?PostgreSQL中0.01744649转0.018实现疑问
搞定PostgreSQL 9.1里的特殊向上舍入需求
我明白你遇到的问题了——想用PostgreSQL的数学函数把0.01744649向上舍入到0.018,但常规的ceil()或者round()都达不到预期,对吧?
先说说为啥常规方法不行:如果你直接用ceil(0.01744649::numeric * 1000) / 1000,得到的是0.017,因为0.01744649*1000=17.44649,ceil()只会取不小于它的最小整数也就是17,自然得不到你要的0.018。
那要实现把千分位直接进一位(不管后面的小数是多少),可以用这个方法:
SELECT (floor(0.01744649::numeric * 1000) + 1) / 1000 AS rounded_result;
执行这个语句就会返回0.018,正好符合你的预期。拆解一下逻辑:
- 先把数值转成
numeric类型(避免浮点数精度坑),乘以1000把千分位转成整数部分,得到17.44649 - 用
floor()取整得到17(也就是当前千分位的整数部分) - 加1强制进位到
18 - 再除以1000转回到三位小数,就是
0.018
如果需要经常用这个逻辑,还可以封装成一个自定义函数,方便复用:
CREATE OR REPLACE FUNCTION round_up_to_decimals(num numeric, decimal_places int) RETURNS numeric AS $$ BEGIN RETURN (floor(num * power(10, decimal_places)) + 1) / power(10, decimal_places); END; $$ LANGUAGE plpgsql IMMUTABLE;
调用的时候直接传数值和要保留的小数位数就行:
SELECT round_up_to_decimals(0.01744649, 3);
内容的提问来源于stack exchange,提问作者DuGi
相关产品推荐
相关产品推荐

