如何在PostgreSQL中避免浮点运算溢出并返回Infinity而非报错
PostgreSQL 浮点运算溢出返回无穷值的实现方案
PostgreSQL 默认对 float/float8 类型的算术溢出会直接抛出错误,不会静默返回 Infinity,最通用兼容的实现方式为封装自定义安全运算函数,捕获溢出异常后返回对应无穷值:
步骤1:创建自定义安全乘法函数
CREATE OR REPLACE FUNCTION safe_float_multiply(a float8, b float8) RETURNS float8 AS $$ BEGIN RETURN a * b; EXCEPTION -- 捕获数值溢出错误 WHEN numeric_value_out_of_range THEN -- 同号相乘返回正无穷,异号相乘返回负无穷 RETURN CASE WHEN sign(a) = sign(b) THEN 'Infinity'::float8 ELSE '-Infinity'::float8 END; END; $$ LANGUAGE plpgsql IMMUTABLE;
步骤2:调用函数执行运算
SELECT safe_float_multiply(1E300::float, 1E300::float);
执行后即可得到预期返回结果 Infinity。
如果需要适配加法、减法、除法等其他运算,参照上述逻辑封装对应函数即可。
内容的提问来源于stack exchange,提问作者Lukas Eder
相关产品推荐
相关产品推荐

