Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 11, 2016 15:54:23

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Простое математическое округление

MaratD
round не угодил этим:

ZerG
Ну а если просто до ближайшего целого числа
# -*- coding: utf-8 -*-
import math
res = 4.335/3
print math.ceil(res)

2.0

Вы не написали чем вам не угодил другой вариант.



Офлайн

#2 Авг. 11, 2016 16:10:02

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Простое математическое округление

Вам не кажется странным следующее
>>> round(1.445, 2)
1.45
>>> round(1.545, 2)
1.54

Офлайн

#3 Авг. 11, 2016 16:13:02

MaratD
Зарегистрирован: 2016-01-25
Сообщения: 138
Репутация: +  0  -
Профиль   Отправить e-mail  

Простое математическое округление

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

Офлайн

#4 Авг. 11, 2016 17:19:15

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Простое математическое округление

Тут вот какое дело. Во float числа хранятся в формате с плавающей точкой ieee 754, а там много веселого, за подробностями в спецификацию. Питон щадит ваши нервы и при отображении приводит вид к более-менее ожидаемому вами представлению, но можно глянуть и внутрь, смотрите:

 >>> a = 1.445
0: 1.445
>>> b = 1.545
1: 1.545
>>> c = round(a, 2)
2: 1.45
>>> d = round(b, 2)
3: 1.54
это была синяя таблетка, а теперь красная
 >>> '{:.53f}'.format(a)
4: '1.44500000000000006217248937900876626372337341308593750'
>>> '{:.53f}'.format(b)
5: '1.54499999999999992894572642398998141288757324218750000'
>>> '{:.53f}'.format(c)
6: '1.44999999999999995559107901499373838305473327636718750'
>>> '{:.53f}'.format(d)
7: '1.54000000000000003552713678800500929355621337890625000'


Зы: вот неплохая вводная статья



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Отредактировано PooH (Авг. 11, 2016 17:27:59)

Офлайн

#5 Авг. 11, 2016 21:22:19

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Простое математическое округление

PooH
Во float числа хранятся в формате с плавающей точкой….
Может быть. Но есть еще статья какие бывают виды округления.
https://ru.wikipedia.org/wiki/%D0%9E%D0%BA%D1%80%D1%83%D0%B3%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5

Есть к счастью докуменатция по питону
https://docs.python.org/3/library/functions.html#round

round(number)
Return the floating point value number rounded to ndigits digits after the decimal point. If ndigits is omitted, it returns the nearest integer to its input. Delegates to number.__round__(ndigits).

For the built-in types supporting round(), values are rounded to the closest multiple of 10 to the power minus ndigits; 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). The return value is an integer if called with one argument, otherwise of the same type as number.

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

Это так называемое банковское округление.

MaratD
Вам не кажется странным следующее
Не кажется странным. Былобы очень странно если было не так.

MaratD
какая логика округления не пойму?
Могу только посоветовать еще раз прочитать документацию. Там всего один абзац.



Офлайн

#6 Авг. 12, 2016 05:02:02

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Простое математическое округление

doza_and
rounding is done toward the even choice
Согласен. Пропустил это в доке, внутренний формат не причем.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#7 Дек. 16, 2018 16:54:55

qa13
Зарегистрирован: 2018-12-16
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Простое математическое округление

MaratD
о
Классическое округление, без использования библиотек. Наслаждайтесь
 def rd(x,y=0):
    ''' A classical mathematical rounding by Voznica '''
    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
# Сравните:
print( round(0.49), round(0.51), round(0.5), round(1.5), round(2.5), round(0.15,1))  # 0  1  0  2  2  0.1
print( rd(0.49), rd(0.51), rd(0.5), rd(1.5), rd(2.5), rd(0.15,1))  # 0  1  1  2  3  0.2

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version