SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » FLOAT (Точность FLOAT)
FLOAT [сообщение #6288] Mon, 23 February 2026 08:46 Переход к следующему сообщению
bsa1959 в настоящее время не в онлайне  bsa1959
Сообщений: 11
Зарегистрирован: December 2025
Junior Member
Возникла проблема округления в процедуре FIREBIRD 5.
В таблице есть поле типа FLOAT. Имеет значения от 1.00 до 1.60 через 0.1.
Процедура возвращает нехорошие значения. Т.е. не соответствуют значениям посчитаным вручную.
Прошел под IBEXPERT в отладке.
Вместо 1.00 увидел 1.0139 для этого поля после чтения из таблицы...
Где я не прав?
Хотя по документации:
Тип данных FLOAT по умолчанию представляет собой 32-битный тип с плавающей запятой
одинарной точности с приблизительной точностью 7 десятичных знаков после десятичной
точки
(24 двоичных знака). Числа типа FLOAT находятся в диапазоне от 1.175 x 10-38 до 3.402 x
1038.

[Обновления: Mon, 23 February 2026 08:54]

Известить модератора

Re: FLOAT [сообщение #6291 является ответом на сообщение #6288] Mon, 23 February 2026 15:22 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 462
Зарегистрирован: August 2022
Senior Member
Ты путаешь точность отдельно взятого числа и точность серии расчётов пачки таких чисел.

Переходи на точные числа, раз у тебя шаг фиксированный.
Re: FLOAT [сообщение #6292 является ответом на сообщение #6291] Mon, 23 February 2026 19:21 Переход к предыдущему сообщениюПереход к следующему сообщению
bsa1959 в настоящее время не в онлайне  bsa1959
Сообщений: 11
Зарегистрирован: December 2025
Junior Member
SD писал(а) Mon, 23 February 2026 15:22
Ты путаешь точность отдельно взятого числа и точность серии расчётов пачки таких чисел.

Переходи на точные числа, раз у тебя шаг фиксированный.
Вы меня, наверное, не поняли....
я Записал в поле FLOAT 1.100
Почему я на чтении получаю этот результат?

Еще раз повторяю - на ЧТЕНИи. И через ibexpert....


[Обновления: Mon, 23 February 2026 19:23]

Известить модератора

Re: FLOAT [сообщение #6293 является ответом на сообщение #6292] Mon, 23 February 2026 19:47 Переход к предыдущему сообщениюПереход к следующему сообщению
bsa1959 в настоящее время не в онлайне  bsa1959
Сообщений: 11
Зарегистрирован: December 2025
Junior Member
Ты путаешь точность отдельно взятого числа и точность серии расчётов пачки таких чисел.

Я не путаю... Я нашел поле типа FLOAT которое мне возвращает для меня очень удивительное значение...
И дальше летит к какой то матери все мои расчеты и округления....
Re: FLOAT [сообщение #6294 является ответом на сообщение #6293] Tue, 24 February 2026 01:27 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 462
Зарегистрирован: August 2022
Senior Member
Потому что это FLOAT. Он так устроен. Он так работает. Никогда не используй его.

Ну или жалуйся Хвастунову:
SQL> create table fl (f float);
SQL> insert into fl values(1.100);
SQL> select * from fl;

             F
==============
     1.1000000

[Обновления: Tue, 24 February 2026 01:30]

Известить модератора

Re: FLOAT [сообщение #6295 является ответом на сообщение #6293] Tue, 24 February 2026 04:03 Переход к предыдущему сообщениюПереход к следующему сообщению
DarkMaster в настоящее время не в онлайне  DarkMaster
Сообщений: 55
Зарегистрирован: August 2022
Member
В NUMERIC() твои данные не влезут?
Re: FLOAT [сообщение #6296 является ответом на сообщение #6295] Tue, 24 February 2026 15:01 Переход к предыдущему сообщениюПереход к следующему сообщению
bsa1959 в настоящее время не в онлайне  bsa1959
Сообщений: 11
Зарегистрирован: December 2025
Junior Member
Влазит, конечно.
Но я склоняюсь к тому, что это ошибка самой БД.
И именно при select в процедуре, а может и функциях. Объявление принимающей переменной (например NUMERIC(15,3)) для поля FLOAT - ничего не меняет. Просто отсекаются лишние цифирьки. Ошибка составляет 1-2%. Это недопустимо.
И, наверняка, ее нужно исправлять...

[Обновления: Tue, 24 February 2026 15:24]

Известить модератора

Re: FLOAT [сообщение #6297 является ответом на сообщение #6296] Tue, 24 February 2026 15:51 Переход к предыдущему сообщениюПереход к следующему сообщению
SD в настоящее время не в онлайне  SD
Сообщений: 462
Зарегистрирован: August 2022
Senior Member
"А может быть корова... А может бегемот." (с)

"Воспроизводимый пример есть?" (с)

Вон у меня выше в скрипте никакие лишние циферки не появляются.
Re: FLOAT [сообщение #6298 является ответом на сообщение #6297] Tue, 24 February 2026 16:35 Переход к предыдущему сообщениюПереход к следующему сообщению
bsa1959 в настоящее время не в онлайне  bsa1959
Сообщений: 11
Зарегистрирован: December 2025
Junior Member
Если Вы прочитаете первое мое сообщение - я просил помощи...
А вместо помощи - хамство...
У меня  select на таблицу с FLOAT возвращает такие-же красивые результаты...
А в процедуре - имею другой результат...
Буду пытаться сделать воспроизводимый пример. Оригинальный Select просто собирает данные с энного количества таблиц...

P.S. Select генериться в процедуре и выполняется через execute statement...

[Обновления: Tue, 24 February 2026 17:00]

Известить модератора

Re: FLOAT [сообщение #6301 является ответом на сообщение #6298] Tue, 24 February 2026 19:50 Переход к предыдущему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 358
Зарегистрирован: June 2022
Senior Member
Процедура секретная? Без кода все эти утверждения о баге бла-бла-бла. Ну и numeric(15,3) в первом диалекте таки хранится как double precision, а не float. А если это не первый диалект, тогда вообще не понимаю ваше упорство с float. Уж если без чисел с плавающей запятой не обойтись, то используйте хотя бы double precision
Предыдущая тема: TIME,TIMESTAMP check для мигрирующих с FB2.5 на 3.0 и выше
Следующая тема: Полнотекстовый поиск для Firebird
Переход к форуму:
  


Текущее время: Tue Feb 24 21:43:51 GMT+3 2026

Общее время, затраченное на создание страницы: 0.00999 секунд