|
|
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Программа: Код: python 1. 2. Результат: Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Документация: говорит, что все так и должно быть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 22:22 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
mini.weblab:) ничего смешного, есть такая схема округления, иногда называемая "банковская" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 22:41 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Это т.н. "банковское округление" можно почитать тут: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1217 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 22:44 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Изопропилmini.weblab:) ничего смешного, есть такая схема округления, иногда называемая "банковская" т.е. если мы округляем 2,5 = то должны получить 2 а если мы округляем 3,5 = то должны получить 4 ?? :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 04:41 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
mini.weblabПрограмма: Код: python 1. 2. Результат: Код: python 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Документация: говорит, что все так и должно быть :) всё потому, что i - double. и что там в самом конце после запятой - неизвестно. хотите стабильных результатов - обрубайте после запятой до нужного знака, а затем округляйте. или выводите полностью, а не 1 знак после запятой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 08:36 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNoseвсё потому, что i - double. и что там в самом конце после запятой - неизвестно. хотите стабильных результатов - обрубайте после запятой до нужного знака, а затем округляйте. Не поможет. По другому надо погрешность учитывать, недавно обсуждали 19934637 19942973 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 08:52 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Если кратко, то в double реальное значение хранится с погрешностью плюс/минус X*1/2 53 где X исходное значение, поэтому 4.5 реально может быть 4.5-4.5/2 53 т.е. чуть-чуть меньше 4.5, поэтому округляется вниз. Для учета отрицательной погрешности надо увеличить округляемое значение на возможную погрешность, в данном случае можно так Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:08 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
AndreyTarasovт.е. если мы округляем 2,5 = то должны получить 2 а если мы округляем 3,5 = то должны получить 4 ?? :-) да. непонятно, что смешного ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:24 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNosemini.weblab:) всё потому, что i - double. в десятичной арифметике с фиксированной точкой - то же самое. набросилилсь на бедный double.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:26 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Изопропилнабросилилсь на бедный 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. Так что совпадение примера с банковским округлением просто случайность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:34 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Dima T, 0.5 в double представляется точно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:42 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Изопропил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 Какой-то новый способ округлений изобрели. По-питоновски. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:56 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
ИзопропилDima T, 0.5 в double представляется точно да. но mini.weblab Код: python 1. это не 0,5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:35 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNose, а сколько при i=1 ? во внутреннем представлении - 0x3fe0000000000000 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:49 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
mini.weblabДокументация: говорит, что все так и должно быть Это было что: вопрос или ответ? Если вопрос, то о чём. Если ответ, то кому? В Python 2 тип результата - такой же, как тип операнда, а в Python 3 тип результата int. Поэтому нужна внимательность во избежание несовместимости по исходному коду между версиями Python-а 2 и 3. А если кому это не нравится. пусть сам изобретёт язык вроде Python-а, но лучше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:50 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
ИзопропилeNose, а сколько при i=1 ? 0,5 +- погрешность вычислений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:28 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
i = 0.5 j = 1/2 можно попробовать сравнить if i=j далеко не в каждом яп будет true. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:32 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNoseИзопропилeNose, а сколько при i=1 ? 0,5 +- погрешность вычислений. Нет тут погрешности. Все степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей. 1 = 1*2 0 1/2 = 1*2 -1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:32 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
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)) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:34 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:37 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
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 в какой степени? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:37 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:38 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Dima T, а теперь думай, почему у тс round(0.5) = 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:38 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Dima T, i=1/2 j=0.5 if i==j: print("true") if i<>j: print("false") http://rextester.com/l/python смотри сам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:41 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Dima TВсе степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей. на бумаге - да. в компьютере - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:42 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
не знаю как в питоне, а в msvc 2.675 - во внутреннем представлении double - 0x4005666666666666, а это на самую малость меньше, чем 2.675 по хорошему 0x4005666666666667 должно быть ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:43 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Dima TeNoseвсё потому, что i - double. и что там в самом конце после запятой - неизвестно. хотите стабильных результатов - обрубайте после запятой до нужного знака, а затем округляйте. Не поможет. По другому надо погрешность учитывать, недавно обсуждали 19934637 19942973 19931261 отвечу тут. это всё неправильно. правильно в цикле i=1 делить i/10 до тех пор, пока комп не выдаст равный предыдущему результат. вот это будет реальная погрешность вычислений конкретного процессора и конкретного компилятора. и вот именно ее и надо использовать при сравнениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:46 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNoseDima TВсе степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей. на бумаге - да. в компьютере - нет. ну не все конечно, а от -1022 до 1023 степени по крайней мере (денормализованное представление не рассматриваю) в компьютере представляются (IEEE754 - уточню на всякий) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:51 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNoseи что там в самом конце после запятой - неизвестно. известно и детерминировано ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:52 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
ИзопропилeNoseпропущено... на бумаге - да. в компьютере - нет. ну не все конечно, а от -1022 до 1023 степени по крайней мере (денормализованное представление не рассматриваю) в компьютере представляются (IEEE754 - уточню на всякий) вы путаете операцию присвоения с операцией деления ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:52 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
ИзопропилeNoseи что там в самом конце после запятой - неизвестно. известно и детерминировано 19946387 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:52 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNoseсмотри сам Посмотрел. Поправь первую строчку Код: python 1. иначе целочисленное деление и i = 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:54 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Dima TeNoseсмотри сам Посмотрел. Поправь первую строчку Код: python 1. иначе целочисленное деление и i = 0 тогда я тоже непонимаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:58 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNoseвы путаете операцию присвоения с операцией деления а что, 2 n где n в диапазоне -1022 до 1023 зависит от того - константой задали или подсчитали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:00 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
а, ну понятно всё. обозначаем нужное деление 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:01 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
ИзопропилeNoseвы путаете операцию присвоения с операцией деления а что, 2 n где n в диапазоне -1022 до 1023 зависит от того - константой задали или подсчитали? в общем случае да зависит как минимум от компилятора ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:02 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
eNoseтогда я тоже непонимаю Тоже запутался. Потом понял, ты не тот питон выбрал, надо третий http://rextester.com/l/python3_online_compiler Разные питоны по разному округляют. Странный ЯП этот питон. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:16 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Dima TВсе степени двойки (в т.ч. отрицательные) преобразуются в double без погрешностей. речь таки о литерале. eNoseзависит как минимум от компилятора это что ж такое нужно наговнокодить в компиляторе чтоб цикл криво отработал Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:18 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
какой то вброс на 2-м питоне получится не round(1.0) = 1.0 , а round(1) = 1.0 т.е. если неправильное деление, то непонятно почему в левой части оно правильное если добавить Код: python 1. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. т.е. всё пучком ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:29 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Загуглил эту тему, нашел забавное объяснение https://pythonworld.ru/osnovy/okruglenie.html Тут есть одна особенность, о которой нужно знать, и о которой часто забывают. Со школы многие привыкли, что, когда (N + 1) знак = 5, а последующие знаки равны нулю, округление производится всегда в большую по модулю сторону. Однако, как видно из примеров, в Python это не так. Здесь используется так называемое "Банковское округление", то есть округление к ближайшему чётному. На практике это оказывается не так уж и важно, например: Код: sql 1. 2. Что-то не так, правда? На самом деле, всё именно так, как и задумывалось. Просто из-за проблем с точностью чисел с плавающей точкой это число чуть больше, чем 2.85, а потому округляется до 2.9. Похоже действительно делали банковское но не доделали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:29 |
|
||
|
округление в Питоне: функция round():
|
|||
|---|---|---|---|
|
#18+
Код: python 1. 2. 3. 4. 5. 6. на выходе - 0x4005666666666666 , что чуток меньше чем 2.675 никакой мистики ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:36 |
|
||
|
|

start [/forum/topic.php?all=1&fid=16&tid=1340556]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
55ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 362ms |

| 0 / 0 |
