Форум сайта python.su
253
MaratD
round не угодил этим:
ZerG
Ну а если просто до ближайшего целого числа
# -*- coding: utf-8 -*-
import math
res = 4.335/3
print math.ceil(res)
2.0
Офлайн
0
Вам не кажется странным следующее
>>> round(1.445, 2)
1.45
>>> round(1.545, 2)
1.54
Офлайн
0
какая логика округления не пойму?
в первом случае увеличивает, во втором уменьшает.
нет стабильных понятных правил. вот чем не угодил.
Офлайн
72
Тут вот какое дело. Во 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)
Офлайн
253
PooHМожет быть. Но есть еще статья какие бывают виды округления.
Во float числа хранятся в формате с плавающей точкой….
MaratDНе кажется странным. Былобы очень странно если было не так.
Вам не кажется странным следующее
MaratDМогу только посоветовать еще раз прочитать документацию. Там всего один абзац.
какая логика округления не пойму?
Офлайн
72
doza_andСогласен. Пропустил это в доке, внутренний формат не причем.
rounding is done toward the even choice
Офлайн
0
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
Офлайн