Найти - Пользователи
Полная версия: Простое математическое округление
Начало » Python для новичков » Простое математическое округление
1 2
doza_and
MaratD
round не угодил этим:

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

2.0

Вы не написали чем вам не угодил другой вариант.
MaratD
Вам не кажется странным следующее
>>> round(1.445, 2)
1.45
>>> round(1.545, 2)
1.54
MaratD
какая логика округления не пойму?
в первом случае увеличивает, во втором уменьшает.
нет стабильных понятных правил. вот чем не угодил.
PooH
Тут вот какое дело. Во 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'


Зы: вот неплохая вводная статья
doza_and
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
какая логика округления не пойму?
Могу только посоветовать еще раз прочитать документацию. Там всего один абзац.
PooH
doza_and
rounding is done toward the even choice
Согласен. Пропустил это в доке, внутренний формат не причем.
qa13
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB