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

Начало » Использование СУБД » Firebird, HQbird, InterBase » Вопрос по округлению
Вопрос по округлению [сообщение #3306] Mon, 09 October 2023 16:36 Переход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 82
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
select 5.00 / 3 from rdb$database

Ожидаю результат 1.67, а дает 1.66
Почему так?
Натолкнулся случайно, обычно при делениях пишу cast(1e0 * 5 / 3 as numeric(18,2))
А тут получил нежданчик

fb 3.0.11
Re: Вопрос по округлению [сообщение #3307 является ответом на сообщение #3306] Mon, 09 October 2023 16:40 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 82
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
Получается на самом деле происходит int(500 / 3) / 100?

[Обновления: Mon, 09 October 2023 16:40]

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

Re: Вопрос по округлению [сообщение #3308 является ответом на сообщение #3307] Mon, 09 October 2023 16:56 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 889
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
диалект какой?
Re: Вопрос по округлению [сообщение #3309 является ответом на сообщение #3307] Mon, 09 October 2023 17:05 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
5.00   / 3    -> 1.66
5.00   / 3.00 -> 1.6666
5.0000 / 3.00 -> 1.666666
По всей видимости, неявное назначение типов для литералов такое:

5      - integer
5.00   - numeric(18,2)
5.0000 - numeric(18,4)
При умножении/делении размеры дробных частей складываются.

Интуиция, воспитанная архетипичным фортраном, настраивает на то, что если есть десятичная точка, то мы имеем дело с float. Но здесь другие правила, в фортране не было чисел с фиксированной точкой, кроме собственно целых.

P.S.
Сорри, вопрос не том, сколько знаков, а почему не округляется в нужную сторону. Так тут не задача максимально точного приближения, свойственная операциям в плавающей точкой, а лишь задача соблюдения нужной размерности. ИМХО.

P.P.S.
5 / 3  -> 1 (а не 2)
Вот здесь же результат кажется естественным и правильным, а он получен ровно по той же логике.

[Обновления: Mon, 09 October 2023 17:19]

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

Re: Вопрос по округлению [сообщение #3310 является ответом на сообщение #3309] Mon, 09 October 2023 17:32 Переход к предыдущему сообщениюПереход к следующему сообщению
shavluk в настоящее время не в онлайне  shavluk
Сообщений: 82
Зарегистрирован: June 2022
Географическое положение: Одеса
Member
3 диалект конечно.
Я понимаю как происходит целочисленное деление, но при нецелочисленном ожидал округление последнего разряда, а не отбрасывание.
Re: Вопрос по округлению [сообщение #3311 является ответом на сообщение #3310] Mon, 09 October 2023 17:52 Переход к предыдущему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 332
Зарегистрирован: June 2022
Senior Member
В 3 диалекте это NUMERIC/DECIMAL - это масштабируемые целые.
При делении целых чисел округление не делается.

Хочешь чтобы было округление, добавляй в масштабе 1 цифру и делай преобразование к числу меньшего масштаба.

SELECT
  5.00 / 3 AS N1,
  CAST(5.00 / 3.0 AS NUMERIC(18, 2)) AS N2,
  CAST(CAST(5.00 AS DECFLOAT(16)) / 3 AS NUMERIC(18, 2)) AS N3,
  CAST(CAST(5.00 AS DOUBLE PRECISION) / 3 AS NUMERIC(18, 2)) AS N4,
  CAST(1e0 * 5.00 / 3 AS NUMERIC(18, 2)) AS N5
FROM RDB$DATABASE
Предыдущая тема: Красный кок
Следующая тема: простое объединение двух таблиц
Переход к форуму:
  


Текущее время: Wed Dec 18 14:06:24 GMT+3 2024

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