Почему SELECT FLOAT (0.1) возвращает 0.1 в DB2? - PullRequest
1 голос
/ 17 июня 2011

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

select FLOAT(0.1) from sysibm.sysdummy1  

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

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

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

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

1 голос
/ 17 июня 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 возвращает представление с плавающей точкой число. FLOAT является синонимом для DOUBLE.

...