Почему выполнение следующего оператора SQL в DB2 возвращает * 0.1
?
select FLOAT(0.1) from sysibm.sysdummy1
Я ожидал приблизительный результат, как для REAL(0.1)
;
Почему и где происходит округление?
* Использование наглядного объяснения
Почему выполнение следующего оператора SQL в DB2 возвращает * 0.1
?
select FLOAT(0.1) from sysibm.sysdummy1
Я ожидал приблизительный результат, как для REAL(0.1)
;
Почему и где происходит округление?
* Использование наглядного объяснения
Это всего лишь предположение, но многие системы при форматировании значений с плавающей запятой для вывода будут печатать кратчайшее число, которое ближе к результату, чем к любому другому числу с плавающей запятой. Поскольку FLOAT имеет двойную точность, а REAL — одинарную точность, они будут округлять «0,1» до различных двоичных приближений, и вполне может быть, что для одного из них 0,1 ближе к округленному значению, чем к любому другому значению формата, в то время как для другого это не так.
Существует разница между 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 возвращает представление числа с плавающей запятой. ПОПЛАВОК является синонимом ДВОЙНОГО.