我发现Amazon Redshift将浮点数的精度截断到非常低的精度(6位)。有没有办法解决这个问题?
示例:
SELECT
JSON_EXTRACT_PATH_TEXT('{"a":123456789.5555555, "b":123456789.0}', 'a')::float,
JSON_EXTRACT_PATH_TEXT('{"a":123456789.5555555, "b":123456789.0}', 'b')::float;
给出:
json_extract_path_text | json_extract_path_text
------------------------+------------------------
123457000 | 123457000
(1 row)
将其与整数进行比较:
SELECT
JSON_EXTRACT_PATH_TEXT('{"a":123456789, "b":123456789}', 'a')::float,
JSON_EXTRACT_PATH_TEXT('{"a":123456789, "b":123456789}', 'b')::float;
结果是:
json_extract_path_text | json_extract_path_text
------------------------+------------------------
123456789 | 123456789
(1 row)
似乎浮动应该具有更高的精度,而不是更少!!!
感谢您的任何见解。
答案 0 :(得分:0)
问题不在于Redshift本身的FLOAT精度,而在于解析的JSON数的精度。如果我们查询JSON而不进行任何转换......
SELECT JSON_EXTRACT_PATH_TEXT('{"a":123456789.5555555}', 'a');
...导致此VARCHAR值:
"1.23457e+08"
因此,任何后续的FLOAT转换只能用于此已经不准确的值。
解决方法是将JSON中的数字存储为字符串...
SELECT JSON_EXTRACT_PATH_TEXT('{"a":"123456789.5555555"}', 'a')::float;
↓
123456789.55555549
如果需要更高的精度,可以使用转换为DECIMAL数据类型...
SELECT JSON_EXTRACT_PATH_TEXT('{"a":"123456789.5555555", "b":123456789.0}', 'a')::decimal(20, 10)
↓
123456789.5555555000
或者你也可以实现一个User-Defined Function,你可以用更高的精度自己进行JSON解析。