HIVE длинные десятичные результаты

В кусте, когда вы выполняете оператор SELECT ниже, он возвращает 1.20000000000000002 как результат вместо 1.2.

выберите 1,1 + 0,1;

На самом деле, мы делаем то же самое в наших таблицах улья при сохранении аналогичного значения FLOAT, поэтому я хочу спросить об этом. Спасибо

1 ответ

Решение

Вот как работает арифметика с плавающей точкой. Если вам нужна точность, cast результат как decimal,

select cast(1.1+0.1 as decimal(9,1))

Из документации улья

Десятичные литералы обеспечивают точные значения и больший диапазон для чисел с плавающей запятой, чем тип DOUBLE. Десятичные типы данных хранят точные представления числовых значений, в то время как типы данных DOUBLE хранят очень близкие приближения числовых значений.

Десятичные типы необходимы для случаев использования, в которых (очень близкого) приближения DOUBLE недостаточно, таких как финансовые приложения, проверки на равенство и неравенство и операции округления. Они также необходимы для случаев использования, которые имеют дело с числами вне диапазона DOUBLE (приблизительно от -10308 до 10308) или очень близко к нулю (от -10-308 до 10-308). Для общего обсуждения ограничений типа DOUBLE, см. Статью Wikipedia Формат с плавающей запятой двойной точности.

Другие вопросы по тегам