获得数字除法的准确结果
Posted
技术标签:
【中文标题】获得数字除法的准确结果【英文标题】:Get exact result for number division 【发布时间】:2013-06-06 13:53:03 【问题描述】:SELECT 9/2
给4
为什么给postgresql自动四舍五入的结果?
有一些选项可以防止这种情况发生吗? (也就是说,我需要除法后,如果结果是浮点数,则返回精确而不是四舍五入的结果)。
更新:
例如从函数,我需要返回浮点数
CREATE OR REPLACE FUNCTION division_test (arg1 INTEGER, arg2 INTEGER,) RETURNS NUMERIC
AS $$
BEGIN
RETURN arg1 / arg2;
END;
$$
LANGUAGE plpgsql;
SELECT division_test (9,2)
结果:4
如何解决这个问题?
【问题讨论】:
【参考方案1】:没有尝试过,SELECT 9.0/2.0
会帮助你吗?
作为对已编辑问题的回答:
更改参数中的数据类型会有帮助吗?
CREATE OR REPLACE FUNCTION division_test (arg1 REAL, arg2 REAL) RETURNS REAL
AS $$
BEGIN
RETURN arg1 / arg2;
END;
$$
LANGUAGE plpgsql;
或者根据您所需的精度,您也可以使用NUMERIC
或其他配件numeric type。
【讨论】:
@OTARIKI:因为两个输入参数都是整数,所以结果也会被转换为整数,给你一个“四舍五入”的结果。将输入参数的类型更改为real
时,除法的结果也是real
。
@a_horse_with_no_name --- 谢谢。
正如所指出的,它与除法运算的输入参数有关。但是,为了清楚起见,它不一定是一个函数。对选择进行类型转换也是如此。如:SELECT (9/2) as int_value, (9::real/2::real), (9::numeric/2::numeric) as numeric_value;
【参考方案2】:
一个选项乘以或除以 1.0,结果将是小数。
psql (9.4.5) Type "help" for help. tabd=# select 1 / 10; ---------- 0 (1 row) tabd=# select 1.0 * 1 / 10; ------------------------ 0.10000000000000000000 (1 row)
【讨论】:
以上是关于获得数字除法的准确结果的主要内容,如果未能解决你的问题,请参考以下文章