Просмотр полной версии : Округление вещественного числа
sertol64
18.06.2020, 13:41
Доброго дня! Уважаемые Волшебники, всю голову сломал как округлить вещественное число до десятой доли. А именно есть таблица, что к температуре 16,0грд соответствует некий коэффициент, а к температуре 16,5 соответствует другой коэффициент. И так далее с прибавлением 0,5 вплоть до 30грд. Но на аналоговый вход от датчика приходит и 16,1 и 16,2 и 16,3 и 16,4 и т.д. Как умудриться, чтоб если уж 16,1(16,2) соответствовало 16,0 а 16,3(16,4)соответствовало16,5. В базе есть макрос floor(по-моему) но он округляет до целого числа в меньшую сторону. МоЖ у кого есть какие решения?!
Ревака Юрий
18.06.2020, 14:33
Доброго дня! Уважаемые Волшебники, всю голову сломал как округлить вещественное число до десятой доли. А именно есть таблица, что к температуре 16,0грд соответствует некий коэффициент, а к температуре 16,5 соответствует другой коэффициент. И так далее с прибавлением 0,5 вплоть до 30грд. Но на аналоговый вход от датчика приходит и 16,1 и 16,2 и 16,3 и 16,4 и т.д. Как умудриться, чтоб если уж 16,1(16,2) соответствовало 16,0 а 16,3(16,4)соответствовало16,5. В базе есть макрос floor(по-моему) но он округляет до целого числа в меньшую сторону. МоЖ у кого есть какие решения?!
Да, этот именно к "полу" округляет, нужен был для одного проекта, по Вашей теме макрос недавно попадался, сейчас поищу тему.
Вот https://owen.ru/forum/attachment.php?attachmentid=49637&d=1592163043 картинка, а где-то тут наверное, сам макрос https://owen.ru/forum/attachment.php?attachmentid=49246&d=1590401339
sertol64
18.06.2020, 16:48
плюс 0.5 и то_инт вот и весь макрос
Я Жж не увижу десятой части числа? INT все числа округляет до целого. Или я что то не понял?
sertol64
18.06.2020, 16:49
Зачем до десятой когда нужно до 0.5 ? Общий вид округлений (в термины ПР перевести)
real_to_int(X / M) * M; //M здесь 0.5/0.1/0.01 - то до чего хотите. Хоть 23.
Уважаемый Валенок я ничего не понял, перевод в int округляет до целого. Поясните пожалуйста.
Я повторюсь. Округление должно быть такое : Если допустим температура 16,1, то 16,0, если 16,2, то 16,0 если же 16,3, то уже 16,5. И т.д. В у мной таблице только температурные коэффициенты по пол.градуса.
Уважаемый Валенок я ничего не понял, перевод в int округляет до целого. Поясните пожалуйста.
Я повторюсь. Округление должно быть такое : Если допустим температура 16,1, то 16,0, если 16,2, то 16,0 если же 16,3, то уже 16,5. И т.д. В у мной таблице только температурные коэффициенты по пол.градуса.
Вот по мотивам Валенка
49701
13,1 --> 13
49702
13,3 --> 13,5
49703
13,7 --> 13,5
49704
13,8 --> 14,0
49705
Надеюсь исходные числа >= 0?
иначе макрос целочисленного деления с округлением DIV_05 нужно заменить на другой,
sertol64
18.06.2020, 18:27
Воооо! Вот ОНО! Всё дело в этом таинственном макросе DIV05_1. Проблема решена. Спасибо всем!!! Будем дальше "ваять"!
Воооо! Вот ОНО! Всё дело в этом таинственном макросе DIV05_1. Проблема решена. Спасибо всем!!! Будем дальше "ваять"!
Это деление целых чисел с округление результата, а не с отбрасыванием дробной части результата
Какие ж тут мотивы то ? Ни разу.
И чего ТС уперся в свои 0.1 если ему надо 0.5 ?
M - это определитель округления. Нужно 0.1 => M = 0.1. Нужно 0.01 => M = 0.01. Аффтору нужно 0.5. Вот и пусть ставит 0.5
Лоджик чего то у меня не симулируется. Вот эквивалент. Пихнуть в макрос думаю не проблема
Но автору нужно
Если допустим температура 16,1, то 16,0, если 16,2, то 16,0 если же 16,3, то уже 16,5.
А этот алгоритм в ОЛ для 16,3 даст только 16
49710
и для 16,4 тоже 16
49711
По этому и "по мотивам"
В ОЛ REAL_TO_INT просто отбрасывает дробную часть,а кодесис REAL_TO_INT округляет целое
49712
С какого ? Попробуйте.
PS
to int в ОЛ - не округляет штоли :confused: ?
Нет!
49713
49714
это как раз к petera по поводу минусов в целочисленных
Запросто!
49720
49715 == 49716
49717 == 49718
Эти макросы наплодил давно
У меня их много :-)
49719
Сергей0308
19.06.2020, 13:02
Доброго дня! Уважаемые Волшебники, всю голову сломал как округлить вещественное число до десятой доли. А именно есть таблица, что к температуре 16,0грд соответствует некий коэффициент, а к температуре 16,5 соответствует другой коэффициент. И так далее с прибавлением 0,5 вплоть до 30грд. Но на аналоговый вход от датчика приходит и 16,1 и 16,2 и 16,3 и 16,4 и т.д. Как умудриться, чтоб если уж 16,1(16,2) соответствовало 16,0 а 16,3(16,4)соответствовало16,5. В базе есть макрос floor(по-моему) но он округляет до целого числа в меньшую сторону. МоЖ у кого есть какие решения?!
Очень интересно и как такое округление следует правильно называть? Есть округление до целых, до десятых, до сотых, до тысячных долей, это наверно называется до "полуцелых" или до 1/2?
Есть правила округления и их несколько, можете найти в Вики, там еще проверяется четность и нечетность следующего знака, до которого хотите округлять и значение уже округленное может быть 3,25 или 3,26 в зависимости от следующего знака.
з.ы. я когда-то выкладывал макросы, один из которых работал по этому правилу округления.
з.ы. 16.3 никогда не может стать 16.5, а вот 16.4 в некоторых случаях может. Других правил вроде не существует, если конечно сами не напишите :)
Вики тута не библия. Причем тут каких-то "знаков" в применении к правилам округления ? 16.3 может стать чем угодно по всем правилам округления.
Не надо частные случаи выдавать за абсолют
Я еще и неполное определение округления привел - линейность/нелинейность и и точку отсчета кванта пропустил.
А то что Вы приводите - линейная дискретизация по степени десятки с точкой отсчета 0.
Сама по себе вещественное число уже округлено в форме хранения по "нелинейная дискретизация по степени 2 с точкой отсчета 0". Причем это все пока в узких рамках числовой прямой рассматриваем ))
какие частные случаи ? в математике есть правила округления, вот например https://ibrain.kz/matematika/pravila-okrugleniya
Вот один из макросов я и делал кажется по правилу 3.
а так, можно округлять как самому захочется, вот как автор написал - 16.1, 16.2 = 16, а 16.3, 16.4 = 16.5
Никто же не запрещает в принципе
в математике есть правила округления
а здесь форум математиков школьного курса?
правило которое предложил Валенок это обычная офисная функция, например для бухгалтеров, вот пару ссылочек
https://support.google.com/docs/answer/3093426?hl=ru
https://support.microsoft.com/ru-ru/office/%D0%BE%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D1%82-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F-%D0%BE%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D1%82-c299c3b0-15a5-426d-aa4b-d2d5b3baf427
из вполне значимых источников не хуже вики
и потом уже от программистов
https://www.internet-technologies.ru/articles/metody-okrugleniya-chisel-v-javascript.html
раздел "Округление до ближайшего кратного числа"
О да, в ОЛ есть .toPrecision(3);..... речь то об ОЛ больше, и как округление реализовать в нем. самое простое это на 0.5 но если людям надо иначе, для этого и делались макросы.
да макросы вроде в соответствующей ветке есть. Вероятно и в менеджере тоже.
а в чем проверка заключается ? скачать и установить в программе ?
да ни при чем, просто сделал такой макрос и все. :)
Очень интересно и как такое округление следует правильно называть? Есть округление до целых, до десятых, до сотых, до тысячных долей, это наверно называется до "полуцелых" или до 1/2?
Наверное, дискретизация.
Алексей Геннадьевич
17.08.2020, 11:02
Очень интересно и как такое округление следует правильно называть? Есть округление до целых, до десятых, до сотых, до тысячных долей, это наверно называется до "полуцелых" или до 1/2?
Математическое округление.
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot