Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/64: Рейтинг темы: голосов - 64, средняя оценка - 4.63
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4

Классическое округление чисел

09.08.2021, 13:15. Показов 13743. Ответов 12

Студворк — интернет-сервис помощи студентам
Добрый день!

Подскажите осталось ли в каком-нибудь модуле Python 3 обычное, а не банковское округление чисел?

Нашел такой код.
Python
1
2
3
4
5
6
7
8
def around(x, y=0):
    m = int('1'+'0'*y) # multiplier - how many positions to the right
    q = x * m # shift to the right by multiplier
    c = int(q) # new number
    i = int( (q-c) * 10 ) # indicator number on the right
    if i >= 5:
        c += 1
    return c/m
Нашел пока единственный минус - отрицательные значения округляет неправильно. А в целом возвращает такие же результаты, как и функция ОКРУГЛ() в MS Excel - это обязательное условие, часть расчетов другими людьми выполняется в Excel.

Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.08.2021, 13:15
Ответы с готовыми решениями:

Округление чисел
Условие "Безумный титан Танос собрал все 6 камней бесконечности и намеревается уничтожить половину населения Вселенной по щелчку пальцев....

Округление чисел
Как в конце округлить числа? import math def f(u, t): if u >= 0: return u + 2 * t elif u <= -1: ...

Округление чисел
Округлить значение до ближайшего целого заданного числа. Заданное число делится на десять (20,30,40...) без остатка.

12
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
09.08.2021, 17:02
VistaSV30,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
round(number[, ndigits])
 
number : Число, которое требуется округлить.
 
ndigits : Количество знаков после запятой. Если не указано, то равно 0.
 
Обеспечивает стандартное округление.
>>> round(2.567), round(2.467), round(2.567, 2) 
         # Округление до ближайшей цифры ( в Python 3.0) 
(3, 2, 2.57)
 
>>> round(-2.567), round(-2,467), round(-2.567,2)
                   # Округление до ближайшей цифры
(-3, -2, -2.57)
Добавлено через 6 минут
Также округление можно сделать используя встроенный модуль math.
Или настраивать вывод на экран с помощью Мини-языка форматирования.
http://pythonz.net/references/... irovaniya/
https://docs.python.org/3/libr... i-language
1
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
09.08.2021, 19:25  [ТС]
С функцией round() как раз и проблема, когда первая цифра отбрасываемой части 5, то округление происходит к ближайшему четному числу

Python
1
2
print(round(2.65, 1)) # нужно 2.7, а получаем 2.6
print(round(2.75, 1)) # здесь округляется как обычно, получаем 2.8
В модуле math тоже банковское округление

Добавлено через 5 минут
Банковское округление выполняется к ближайшему четному. Применение такого способа округления связано с тем, что в процессе округления только четыре цифры приводят к округлению в меньшую сторону – 1, 2, 3 и 4. Количество цифр приводящих к округлению в большую сторону пять – 5, 6, 7, 8 и 9. Такое неравенство приводит к тому, что при большом количестве вычислений с округленными дробными значениями постоянно нарастает погрешность.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
09.08.2021, 20:23
VistaSV30, С чего Вы взяли, что 2.65 должно округлятся до 2.7 ?
классическое математическое округление, это 2.6.
Правило округления такое:
Если мы округляем до необходимого разряда после запятой, то число после этого разряда отбрасывается, если оно меньше или равно 5 (то есть относится к первой половине от 10). Если хоть на какую то пусть ничтожную долю, остаток больше 5, то прибавляется единица.
Python
1
2
>>> round(2.65000000000001, 1)
2.7
Так что здесь классическое, чисто математическое округление, которому учат в школе.
Если Вы хотите не стандартное для математики округление, то напишите свою функцию округления.
0
Эксперт Python
8837 / 4489 / 1864
Регистрация: 27.03.2020
Сообщений: 7,311
09.08.2021, 20:26
Лучший ответ Сообщение было отмечено VistaSV30 как решение

Решение

VistaSV30, так?
Python
1
2
3
4
5
6
7
8
9
10
11
def round_number(num, cnt):
    z = 1 if num > 0 else -1
    num *= z
    k = 10**cnt
    num *= k*10
    if num%10 >= 5:
        num = num + 10
    num = int(num/10)
    return num/k*z
 
print(round_number(-25.56, 7))
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
09.08.2021, 21:29
А вот здесь почему то округляет не так.
Python
1
2
>>> round(2.75, 1)
2.8
Может я ошибся с правилом, посмотрю в интернете.
Но тут еще есть особенность питона. Он в памяти, если я не ошибаюсь, хранит десятичные числа в виде рациональных дробей. В самой машине, число задается битами, в виде целого двоичного числа. Поэтому внутри машины нет такого понятия как десятичная точка. Из за этого и возникают такие нюансы при округлении.
2.75, на самом деле хранится внутри как рациональная дробь.
И при округлении зависит от того, есть ли хвост после цифры 5 при делении рациональной дроби , определяющей десятичную дробь.
У числа 2.65 видимо хвоста нет, поэтому здесь округляет правильно, 2.6
а у числа 2.75 видимо есть хвост, который искажает классическое округление. Которое должно быть таким 2.7 , а выводит 2.8 .

Добавлено через 19 минут
VistaSV30, Смешно. Посмотрел в интернете, там каждый дает свое правило округления.
Как все таки более правильно, это нужно смотреть в каком то стандарте.
В общем округляйте как Вам нравится, используя свою функцию. Важно только это округление было по одному правилу для всех случаев.

Добавлено через 11 минут
VistaSV30, Хотя я не прав. Везде используется правило , что 5 всегда добавляет единицу. То есть должно быть так
Python
1
2
>>> round(2.65, 1)
2.7
Видимо в питоне рациональная дробь дает число меньшее 2.65 , а где то 2.64........и при выводе показывает 2.65, а при округлении отбрасывает 4...... .

Добавлено через 1 минуту
В общем выход один, использовать свою функцию.

Добавлено через 10 минут
VistaSV30, Вам такую функцию написал Gdez,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
def round_number(num, cnt):
    z = 1 if num > 0 else -1
    num *= z
    k = 10**cnt
    num *= k*10
    if num%10 >= 5:
        num = num + 10
    num = int(num/10)
    return num/k*z
 
print(round_number(2.65, 1))  # 2.7
 
print(round_number(2.75, 1))  # 2.8
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
09.08.2021, 21:32
VistaSV30, кури: Rounding modes.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
09.08.2021, 21:38
Python
1
2
3
print(round_number(-2.65, 1))  # -2.7
 
print(round_number(-2.75, 1))  # -2.8
Добавлено через 4 минуты
Arsegg, Я не стал рекомендовать модуль decimal , так как Лутц пишет, что он редко используется. Не знаю почему.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
09.08.2021, 21:40
Python
1
2
3
4
5
6
7
from decimal import Context, ROUND_HALF_UP
 
 
a = Context(prec=2, rounding=ROUND_HALF_UP).create_decimal("2.65")
b = Context(prec=2, rounding=ROUND_HALF_UP).create_decimal("2.75")
assert str(a) == "2.7"
assert str(b) == "2.8"
2
09.08.2021, 21:41

Не по теме:

Я не стал рекомендовать модуль decimal , так как Лутц пишет, что он редко используется. Не знаю почему.
Кликните здесь для просмотра всего текста
Название: icon-225x300.jpg
Просмотров: 212

Размер: 19.0 Кб

0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
10.08.2021, 12:31  [ТС]
Gdez, спасибо за функцию округления!

Читал, что Python 2 использовал математическое округление 0,5
Теперь Python 3 и еще ряд приложений используют банковское округление.

Мне нужно именно математическое.

Спасибо!

Добавлено через 5 минут
Немного докрутил код. Добавил, округление до целого по умолчанию
Python
1
2
3
4
5
6
7
8
9
10
11
def round_number(num, cnt = 0):
    z = 1 if num > 0 else -1
    num *= z
    k = 10**cnt
    num *= k*10
    if num%10 >= 5:
        num = num + 10
    num = int(num/10)
    return num/k*z
 
print(round_number(-25.56, 7))
1
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
13.08.2021, 23:48  [ТС]
Еще вариант (с форума R подсказали)
Python
1
2
3
4
def mround(x, n=0):
    posneg = 1 if x > 0 else -1
    z = (int(abs(x) * 10 ** n + 0.5))  / 10 ** n
    return(z * posneg)
Добавлено через 11 минут
В C++ как я понял, тоже используется банковское округление. Подскажите в каких еще языках есть такое?
0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
14.08.2021, 11:13  [ТС]
В США и странах Евросоюза округление производится в соответствии с IEEE 754-2008

Округление к ближайшему (привязка к четному). Если два ближайших числа с плавающей точкой одинаково близки, то должно быть получено число с чётной самой младшей цифрой. Это вариант по умолчанию для двоичной плавающей запятой и рекомендованный вариант по умолчанию для десятичного числа.


В России и других странах СНГ используется ГОСТ Р 8.736-2011

Е.5 Сохраняемую, значащую цифру в погрешности оценки измеряемой величины при округлении увеличивают на единицу, если отбрасываемая цифра неуказываемого младшего разряда больше либо равна пяти, и не изменяют, если она меньше пяти.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.08.2021, 11:13
Помогаю со студенческими работами здесь

Округление чисел с параметром округление десятичное число
Здравствуйте. Мне нужно округлить число и задать параметр округление - вводимое с клавиатуру. Math.Round не работают параметр округление...

Округление чисел
Допустим,имеется число с тремя знаками после запятой,а достаточно точности,если после запятой имеем два значения,то есть число необходимо...

Округление чисел
Здравствуйте! У меня вот такой вопрос, Как можно сделать чтоб выводило на экран косинусы углов 45 и 40 градусов 0.707 и 0.766 а не все...

Округление чисел
Здравствуйте. Реализую метод, где необходима проверка является ли число целым. Функция is_int() не работает, написал свою функцию. ...

Округление чисел
Добрый вечер,подскажите пожалуйста,как можно округлить число до ближайшего меньшего по модулю значения????


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru