Начало » Использование СУБД » Firebird, HQbird, InterBase » Вопрос по округлению
|
|
|
Re: Вопрос по округлению [сообщение #3309 является ответом на сообщение #3307] |
Mon, 09 October 2023 17:05   |
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.
Вот здесь же результат кажется естественным и правильным, а он получен ровно по той же логике.
[Обновления: Mon, 09 October 2023 17:19] Известить модератора
|
|
|
|
Re: Вопрос по округлению [сообщение #3311 является ответом на сообщение #3310] |
Mon, 09 October 2023 17:52  |
sim_84
Сообщений: 350 Зарегистрирован: 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 Apr 04 06:57:26 GMT+3 2025
Общее время, затраченное на создание страницы: 0.00874 секунд
|