如何在PostgreSQL JDBC连接上保持float-> String转换的精度

时间:2016-01-24 19:43:23

标签: postgresql jdbc

我有一个PostgreSQL函数,它接受JSON,执行一些处理,并返回JSON。从Java appication调用存储过程时发生了一些奇怪的事情 - float->字符串转换不正确。

处理主要是过滤数据并返回重组和重组结果。为简单起见,我们假设输入为地图[name->float],输出为[float]

问题是在中间数据存储期间将值存入本机PostgreSQL数据类型浮点值会丢失精度/准确度/格式。

以下是重现的代码

CREATE OR REPLACE FUNCTION do_dummy()
    RETURNS void LANGUAGE plpgsql AS $$
DECLARE
    v_float float[];
    v_json jsonb;
    v_str varchar;
BEGIN
    v_float[0] = 4.1;
    raise notice 'v_float = %', v_float[0];
    raise notice 'jsonb float -> %', ('{"v": 4.1}'::jsonb)->'v';
    raise notice 'jsonb float ->> %', ('{"v": 4.1}'::jsonb)->>'v';

    v_float[0] = ('{"v": 4.1}'::jsonb)->>'v';
    raise notice 'jsonb float ->>::float %', v_float[0];

    v_json = array_to_json(v_float);
    raise notice 'jsonb: %', v_json;

    v_str = concat('jsonb as string: ', v_json::varchar);
    raise notice '%', v_str;
END $$

执行时

select do_dummy();

...通过pgAdmin,输出跟随并且符合预期:

NOTICE:  v_float = 4.1
NOTICE:  jsonb float -> 4.1
NOTICE:  jsonb float ->> 4.1
NOTICE:  jsonb float ->>::float 4.1
NOTICE:  jsonb: [4.1]
NOTICE:  jsonb as string: [4.1]

从Java应用程序执行相同操作时,结果如下:

NOTICE: v_float = 4.0999999999999996
NOTICE: jsonb float -> 4.1
NOTICE: jsonb float ->> 4.1
NOTICE: jsonb float ->>::float 4.0999999999999996
NOTICE: jsonb: [4.0999999999999996]
NOTICE: jsonb as string: [4.0999999999999996]

由于在函数调用中没有数据传输到服务器/从服务器传输 - 问题完全发生在服务器端,但JDBC驱动程序中的某些内容正在触发问题。

在这方面JDBC连接有什么问题?

我正在使用jdbc驱动程序v9.4.1207(目前最新的驱动程序)

1 个答案:

答案 0 :(得分:0)

驱动程序初始化extra_float_digits

如果你跑

set extra_float_digits = 0;

在调用函数之前,通过JDBC获得相同的输出