Начало » Использование СУБД » Firebird, HQbird, InterBase » Вопрос по округлению
Вопрос по округлению [сообщение #3306] |
Mon, 09 October 2023 16:36 |
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: Вопрос по округлению [сообщение #3309 является ответом на сообщение #3307] |
Mon, 09 October 2023 17:05 |
shalamyansky
Сообщений: 149 Зарегистрирован: 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.
Вот здесь же результат кажется естественным и правильным, а он получен ровно по той же логике.
[Обновления: Mon, 09 October 2023 17:19] Известить модератора
|
|
|
|
Re: Вопрос по округлению [сообщение #3311 является ответом на сообщение #3310] |
Mon, 09 October 2023 17:52 |
sim_84
Сообщений: 329 Зарегистрирован: 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
|
|
|
Переход к форуму:
Текущее время: Fri Nov 15 05:32:28 GMT+3 2024
Общее время, затраченное на создание страницы: 0.00669 секунд
|