powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / округление в Питоне: функция round():
42 сообщений из 42, показаны все 2 страниц
округление в Питоне: функция round():
    #39356400
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программа:
Код: python
1.
2.
for i in range(0, 10):
    print("round({0}) = {1}".format(i/2, round(i/2)) )



Результат:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
round(0.0) = 0
round(0.5) = 0
round(1.0) = 1
round(1.5) = 2
round(2.0) = 2
round(2.5) = 2
round(3.0) = 3
round(3.5) = 4
round(4.0) = 4
round(4.5) = 4



Документация: говорит, что все так и должно быть
:)
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356409
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblab:)
ничего смешного, есть такая схема округления, иногда называемая "банковская"
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356410
deadem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это т.н. "банковское округление" можно почитать тут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356497
AndreyTarasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилmini.weblab:)
ничего смешного, есть такая схема округления, иногда называемая "банковская"

т.е.
если мы округляем 2,5 = то должны получить 2
а
если мы округляем 3,5 = то должны получить 4 ??

:-)
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356530
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
mini.weblabПрограмма:
Код: python
1.
2.
for i in range(0, 10):
    print("round({0}) = {1}".format(i/2, round(i/2)) )




Результат:
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
round(0.0) = 0
round(0.5) = 0
round(1.0) = 1
round(1.5) = 2
round(2.0) = 2
round(2.5) = 2
round(3.0) = 3
round(3.5) = 4
round(4.0) = 4
round(4.5) = 4




Документация: говорит, что все так и должно быть
:) всё потому, что i - double.
и что там в самом конце после запятой - неизвестно.
хотите стабильных результатов - обрубайте после запятой до нужного знака, а затем округляйте.

или выводите полностью, а не 1 знак после запятой.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356538
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseвсё потому, что i - double.
и что там в самом конце после запятой - неизвестно.
хотите стабильных результатов - обрубайте после запятой до нужного знака, а затем округляйте.
Не поможет. По другому надо погрешность учитывать, недавно обсуждали 19934637 19942973
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356544
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если кратко, то в double реальное значение хранится с погрешностью плюс/минус X*1/2 53 где X исходное значение, поэтому 4.5 реально может быть 4.5-4.5/2 53 т.е. чуть-чуть меньше 4.5, поэтому округляется вниз.
Для учета отрицательной погрешности надо увеличить округляемое значение на возможную погрешность, в данном случае можно так
Код: sql
1.
round(i/2 + 0.0001)
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356556
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyTarasovт.е.
если мы округляем 2,5 = то должны получить 2
а
если мы округляем 3,5 = то должны получить 4 ??

:-)

да. непонятно, что смешного
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356559
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNosemini.weblab:) всё потому, что i - double.
в десятичной арифметике с фиксированной точкой - то же самое.

набросилилсь на бедный double....
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356561
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилнабросилилсь на бедный double....
В первом посте ссылка на документацию, а там четко написано:
https://docs.python.org/3/library/functions.html#round Note

The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.
Так что совпадение примера с банковским округлением просто случайность.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356565
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

0.5 в double представляется точно
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356577
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima T,

0.5 в double представляется точно
Согласен.
ХЗ тогда чего в питоне навертели с округлением.

В той же документации
авторif two multiples are equally close, rounding is done toward the even choice (so, for example, both round(0.5) and round(-0.5) are 0, and round(1.5) is 2).

Дальше пример который не по банковски округляет
авторround(2.675, 2) gives 2.67

Какой-то новый способ округлений изобрели. По-питоновски.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356601
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
ИзопропилDima T,

0.5 в double представляется точно да.
но

mini.weblab
Код: python
1.
i/2

это не 0,5.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356613
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNose,

а сколько при i=1 ?

во внутреннем представлении - 0x3fe0000000000000
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356614
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mini.weblabДокументация: говорит, что все так и должно быть

Это было что: вопрос или ответ? Если вопрос, то о чём. Если ответ, то кому?

В Python 2 тип результата - такой же, как тип операнда, а в Python 3 тип результата int.
Поэтому нужна внимательность во избежание несовместимости по исходному коду между версиями Python-а 2 и 3.
А если кому это не нравится. пусть сам изобретёт язык вроде Python-а, но лучше.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356656
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
ИзопропилeNose,

а сколько при i=1 ? 0,5 +- погрешность вычислений.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356662
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
i = 0.5
j = 1/2

можно попробовать сравнить if i=j

далеко не в каждом яп будет true.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseИзопропилeNose,

а сколько при i=1 ? 0,5 +- погрешность вычислений.
Нет тут погрешности. Все степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей.
1 = 1*2 0
1/2 = 1*2 -1
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356670
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima TeNoseпропущено...
0,5 +- погрешность вычислений.
Нет тут погрешности. Все степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей.
1 = 1*2 0
1/2 = 1*2 -1 тогда выведи в питоне
print("round({0}) = {1}".format(2.5, round(2.5)) )

print("round({0}) = {1}".format(3.5, round(3.5)) )
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356672
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
http://rextester.com/l/python

round(2.5) = 3.0
round(3.5) = 4.0
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356673
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseDima Tпропущено...

Нет тут погрешности. Все степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей.
1 = 1*2 0
1/2 = 1*2 -1 тогда выведи в питоне
print("round({0}) = {1}".format(2.5, round(2.5)) )

print("round({0}) = {1}".format(3.5, round(3.5)) )
Читать умеем? 2.5 это 2 в какой степени?
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356674
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima TeNoseпропущено...
тогда выведи в питоне
print("round({0}) = {1}".format(2.5, round(2.5)) )

print("round({0}) = {1}".format(3.5, round(3.5)) )
Читать умеем? 2.5 это 2 в какой степени? round(0.5) = 1.0
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356675
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima T,

а теперь думай, почему у тс round(0.5) = 0
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356678
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima T,

i=1/2
j=0.5
if i==j: print("true")
if i<>j: print("false")





http://rextester.com/l/python


смотри сам
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356681
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima TВсе степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей. на бумаге - да. в компьютере - нет.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356683
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не знаю как в питоне, а в msvc 2.675 - во внутреннем представлении double - 0x4005666666666666, а это на самую малость меньше, чем 2.675

по хорошему 0x4005666666666667 должно быть
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356688
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima TeNoseвсё потому, что i - double.
и что там в самом конце после запятой - неизвестно.
хотите стабильных результатов - обрубайте после запятой до нужного знака, а затем округляйте.
Не поможет. По другому надо погрешность учитывать, недавно обсуждали 19934637 19942973 19931261 отвечу тут.

это всё неправильно.
правильно в цикле i=1 делить i/10 до тех пор, пока комп не выдаст равный предыдущему результат.
вот это будет реальная погрешность вычислений конкретного процессора и конкретного компилятора.

и вот именно ее и надо использовать при сравнениях.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356693
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseDima TВсе степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей. на бумаге - да. в компьютере - нет.
ну не все конечно, а от -1022 до 1023 степени по крайней мере (денормализованное представление не рассматриваю) в компьютере представляются (IEEE754 - уточню на всякий)
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356694
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseи что там в самом конце после запятой - неизвестно.
известно и детерминировано
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356696
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
ИзопропилeNoseпропущено...
на бумаге - да. в компьютере - нет.
ну не все конечно, а от -1022 до 1023 степени по крайней мере (денормализованное представление не рассматриваю) в компьютере представляются (IEEE754 - уточню на всякий) вы путаете операцию присвоения с операцией деления
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356698
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
ИзопропилeNoseи что там в самом конце после запятой - неизвестно.
известно и детерминировано 19946387
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356702
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseсмотри сам
Посмотрел. Поправь первую строчку
Код: python
1.
i=1./2


иначе целочисленное деление и i = 0
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356706
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
Dima TeNoseсмотри сам
Посмотрел. Поправь первую строчку
Код: python
1.
i=1./2



иначе целочисленное деление и i = 0 тогда я тоже непонимаю
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356708
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseвы путаете операцию присвоения с операцией деления
а что, 2 n где n в диапазоне -1022 до 1023 зависит от того - константой задали или подсчитали?
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356712
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
а, ну понятно всё.

обозначаем нужное деление

for i in range(0, 10):
print("round({0}) = {1}".format(i/2., round(i/2.)) )


round(0.0) = 0.0
round(0.5) = 1.0
round(1.0) = 1.0
round(1.5) = 2.0
round(2.0) = 2.0
round(2.5) = 3.0
round(3.0) = 3.0
round(3.5) = 4.0
round(4.0) = 4.0
round(4.5) = 5.0
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356716
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
ИзопропилeNoseвы путаете операцию присвоения с операцией деления
а что, 2 n где n в диапазоне -1022 до 1023 зависит от того - константой задали или подсчитали? в общем случае да

зависит как минимум от компилятора
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356721
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseтогда я тоже непонимаю
Тоже запутался. Потом понял, ты не тот питон выбрал, надо третий http://rextester.com/l/python3_online_compiler

Разные питоны по разному округляют. Странный ЯП этот питон.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356724
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВсе степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей.
речь таки о литерале.
eNoseзависит как минимум от компилятора
это что ж такое нужно наговнокодить в компиляторе
чтоб цикл криво отработал
Код: plaintext
1.
for (int i = 0; i < n; i++) z =  z / 2.0;
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356737
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой то вброс
на 2-м питоне получится

не
round(1.0) = 1.0 , а round(1) = 1.0
т.е. если неправильное деление, то непонятно почему в левой части оно правильное

если добавить
Код: python
1.
#from __future__ import division


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
round(0.0) = 0.0
round(0.5) = 1.0
round(1.0) = 1.0
round(1.5) = 2.0
round(2.0) = 2.0
round(2.5) = 3.0
round(3.0) = 3.0
round(3.5) = 4.0
round(4.0) = 4.0
round(4.5) = 5.0

т.е. всё пучком
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39356738
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Загуглил эту тему, нашел забавное объяснение
https://pythonworld.ru/osnovy/okruglenie.html Тут есть одна особенность, о которой нужно знать, и о которой часто забывают.

Со школы многие привыкли, что, когда (N + 1) знак = 5, а последующие знаки равны нулю, округление производится всегда в большую по модулю сторону.
Однако, как видно из примеров, в Python это не так. Здесь используется так называемое "Банковское округление", то есть округление к ближайшему чётному.

На практике это оказывается не так уж и важно, например:
Код: sql
1.
2.
>>> round(2.85, 1)
2.9


Что-то не так, правда? На самом деле, всё именно так, как и задумывалось. Просто из-за проблем с точностью чисел с плавающей точкой это число чуть больше, чем 2.85, а потому округляется до 2.9.
Похоже действительно делали банковское но не доделали.
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39357091
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: python
1.
2.
3.
4.
5.
6.
import struct

def double_to_hex(f):
    return hex(struct.unpack('<Q', struct.pack('<d', f))[0])

print (double_to_hex(2.675) )



на выходе - 0x4005666666666666 , что чуток меньше чем 2.675
никакой мистики
...
Рейтинг: 0 / 0
округление в Питоне: функция round():
    #39357123
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не вброс и не вопрос, мне просто понравилась фишка
и, опять же, питон не совсем стандартный яп и часто дает повод задуматься
:-)
...
Рейтинг: 0 / 0
42 сообщений из 42, показаны все 2 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / округление в Питоне: функция round():
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]