Encontré una solución y una explicación.
La explicación está
aca, donde afirman los posibles problemas de exactitud de cierto tipo de datos. Para datos exactos, se recomienda usar el tipo de dato numeric con scale.
La solución:
Código sql:
Ver originalCREATE TABLE detalle(
codcab CHARACTER(2) NOT NULL,
codigo CHARACTER(2) NOT NULL,
importe1 NUMERIC(8,2) NOT NULL,
importe2 NUMERIC(8,2) NOT NULL
);
--Funcion
CREATE OR REPLACE FUNCTION pa_grabardetalle(_codcab CHARACTER,_codigo CHARACTER[], _aimporte NUMERIC[][])
RETURNS NUMERIC AS
$BODY$
BEGIN
FOR i IN array_lower(_aimporte,1) .. array_upper(_aimporte,1) LOOP
INSERT INTO detalle(codcab,codigo,importe1,importe2)
VALUES(_codcab,_codigo[i],round(_aimporte[i][1]::NUMERIC,2),round(_aimporte[i][2]::NUMERIC,2));
END LOOP;
IF (SELECT SUM(importe1)-SUM(importe2) FROM detalle WHERE codcab=_codcab)<>0 THEN
RAISE EXCEPTION 'las sumas no coinciden..!';
RETURN 0;
END IF;
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Si deseas mas decimales de exactitud, cambia la escala en la declaración de la tabla y el casteo en el insert dentro del trigger.