powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неправильное округление в Firebird
9 сообщений из 9, страница 1 из 1
Неправильное округление в Firebird
    #38533892
LIKORIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Недавно выяснили, что firebird неправильно округляет. Перейдем сразу к примеру:
есть таблица
Код: sql
1.
2.
3.
4.
CREATE TABLE TABLE_NAME
(
  VAL Float
);


заполненная значениями: 8,36 и 8,37
Делаем запрос:
Код: sql
1.
SELECT round(AVG(VAL), 2) FROM TABLE_NAME;


либо
Код: sql
1.
SELECT CAST(AVG(VAl) as numeric(18,2)) FROM TABLE_NAME;


получаем 8.360000
Как видите результат неправильный.
Однако, если написать
Код: sql
1.
SELECT round(8.365, 2) FROM RDB$DATABASE;


то получим правильный результат 8,37.
Пожалуйста помогите обойти эту проблему.
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38533900
Фотография Exteris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитайте о том, как хранятся вещественные числа(не только в Firebird), станет понятнее.
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38533903
LIKORIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл сообщить, что используем Firebird 2.5, диалект 3.
На данный момент пришли к такому решению:
Код: sql
1.
SELECT CAST(CAST(AVG(VAL) as numeric(18, 6)) AS numeric(18, 2)) FROM TABLE_NAME;


Результат выдает верный, но сам запрос все-таки некорректный.
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38534011
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LIKORISНедавно выяснили, что firebird неправильно округляет.А вы уверены, что умеете округлять ? А то есть сомнения.
Предлагаю для начала посмотреть на AVG(VAL), и рассказать нам - как же его округлить до 2-х знаков после запятой.
Потом (или сначала) пойти в школу и узнать что такое типы данных, кто такой float и как с ним работать.
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38534021
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LIKORIS,

а почему бы сразу не хранить VAL как numeric(18, 2)?
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38534433
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LIKORIS
Код: sql
1.
Float

дальше можно просто не читать.
LIKORIS
Код: sql
1.
round(8.365, 2)

Это нумерик, а не флоат.
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38535132
LIKORIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Супер ответы. Так держать ребята.
Тема закрыта.

--
Если не можешь объяснить, значит сам не знаешь ответа.
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38535146
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE TEST(VAL FLOAT);
commit;
insert into TEST values(8.36);
insert into TEST values(8.37);
commit;

--контрольный запрос. Смотреть в первый столбец!
select cast(avg(VAL) as varchar(20)),
       round(avg(VAL), 1), 
       round(avg(VAL), 2), 
       round(avg(VAL), 3) 
  from TEST;

Получаем:
8.3649997711181648.4000008.3600008.365000

Вопросы есть?
Float-математика - это как бы не совсем та математика, которая из школы, о чем вам намекнули сразу же.
...
Рейтинг: 0 / 0
Неправильное округление в Firebird
    #38535162
oleg_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы к примеру arni добавил еще

Код: sql
1.
SELECT CAST(VAL AS VARCHAR(20)) FROM TEST



CAST8.35999978.3699999
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Неправильное округление в Firebird
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]