Почему SELECT FLOAT(0.1) возвращает 0.1 в DB2?

Почему выполнение следующего оператора SQL в DB2 возвращает * 0.1?

select FLOAT(0.1) from sysibm.sysdummy1  

Я ожидал приблизительный результат, как для REAL(0.1);
Почему и где происходит округление?

* Использование наглядного объяснения


person systempuntoout    schedule 17.06.2011    source источник


Ответы (2)


Это всего лишь предположение, но многие системы при форматировании значений с плавающей запятой для вывода будут печатать кратчайшее число, которое ближе к результату, чем к любому другому числу с плавающей запятой. Поскольку FLOAT имеет двойную точность, а REAL — одинарную точность, они будут округлять «0,1» до различных двоичных приближений, и вполне может быть, что для одного из них 0,1 ближе к округленному значению, чем к любому другому значению формата, в то время как для другого это не так.

person Michael Borgwardt    schedule 17.06.2011

Существует разница между 32-битным (одинарной точностью) и 64-битным (двойной точностью) представлением десятичного значения 0,1. Вы можете использовать онлайн калькулятор IEEE 754, чтобы убедиться в этом.

32 bit: 0.09999999403953552 (3DCCCCCC)
64 bit: 0.1 (3FB999999999999A)

Я проверил документация IBM DB2 и на самом деле функция FLOAT является синонимом DOUBLE, поэтому она возвращает 64-битное представление, которое точно показано там как аппроксимированное значение 0,1.

Функция REAL возвращает представление числа с плавающей запятой одинарной точности.

Функция FLOAT возвращает представление числа с плавающей запятой. ПОПЛАВОК является синонимом ДВОЙНОГО.

person Grzegorz Szpetkowski    schedule 17.06.2011
comment
64-битное значение с плавающей запятой не может точно представлять 0,1 или - person Michael Borgwardt; 17.06.2011