LINUX.ORG.RU

Есть ли в Python 3 нормальная функция арифметического округления?

 


2

2

round() - использует банковское округление к ближайшему четному. Я конечно понимаю, что написать свою функцию 5 мин, но неужели только так и нормального округления нет?

★★★★★
Ответ на: комментарий от Singularity

Это уже округление в большую сторону. Мне не нужно в большую, мне нужно по правилам арифметики:
1.4 = 1
1.5 = 2
2.3 = 2
2.5 = 3

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Ну тогда таки не понимаю, чем не устраивает round? round(1.5) != 2 из-за проблем с числами с плавающей точкой в питоне. Если надо точные вычисления с плавающей точкой use decimal, Luke!.

In [17]: round(1.5000000000000000000000000001)
Out[17]: 2

Singularity ★★★★★
()
Ответ на: комментарий от Stil

То бишь только самописной функцией?
Никаких встроенных или внешних модулей нет??

Что характерно, во 2 версии-то нормально
Зачем так сделали?

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

Там же написано «зачем так». А тебе точно нужно «привычное» округление?

Ну и про ещё один модуль, с которым можешь запилить как хочется там тоже написано...

Stil ★★★★★
()
Последнее исправление: Stil (всего исправлений: 1)
Ответ на: комментарий от Qwentor

по ссылке прошелся и нашел ответ:

import decimal as decimal
print(decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP))
print(decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP))

out:

3
4

bryak ★★★★
()
Ответ на: комментарий от Stil

Ну, портирую код с js на python 3, а в js то нормальное округление. Если оставлю как есть - будет разница в работе, а ее быть не должно, т.к. оба варианта будут работать для разных задач, но результаты должны совпадать

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от bryak

видел, но мне более понравилась функция, т.к. в нее можно передавать численное значение, а не строку. И работает как надо

Qwentor ★★★★★
() автор топика
Ответ на: комментарий от Qwentor

А преобразовать нельзя чтоли число в строку ?

bryak ★★★★
()

Дайте определение нормального.

ZERG ★★★★★
()

неужели только так и нормального округления нет?

А чо ты хотел, это же пистон. Тут всегда так - «мы лучше знаем как вам лучше».

no-such-file ★★★★★
()
Ответ на: комментарий от proud_anon

делать по умолчанию

Это же не значит, что нужно лишать права выбора и заставлять программиста лепить костыли, тем более в скриптовом языке.

no-such-file ★★★★★
()

Нет, даже в ВУЗах это проясняли. Если нужно арифметическое округление – добро пожаловать в R.

bookman900 ★★★★★
()
Ответ на: комментарий от no-such-file

[человек с максотом Лиспа на юзерпике]> Это же не значит, что нужно лишать права выбора и заставлять программиста лепить костыли, тем более в скриптовом языке.

В CL ведь по-умолчанию с округлением то же самое — вниз, вверх и банковское, школьного нет, верно? Или я запамятовал?

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Stil

согласен. еще строк 5 влегкую можно было добавить, но я яишницу жевал и мне было лень

der_looser ★★
()
def fucked_up_round(number, ndigits=0):
    ndigits += 1
    n = round(number, ndigits)*(10**ndigits)
    m = n % 10
    n -= m
    if m >= 5:
        n += 10
    n /= (10**ndigits)
    return n
anonymous
()
Ответ на: комментарий от Qwentor

Троллишь или правда?

Если второе, приветствую, коллега.

Twissel ★★★★★
()
Ответ на: комментарий от Zmicier

В CL ведь по-умолчанию с округлением то же самое

А я что привёл CL в пример? Давай лучше с пыхом сравним. Там есть round который по выбору округляет как надо, да ещё и до произвольного знака, а не только до целого.

no-such-file ★★★★★
()
Ответ на: комментарий от Zmicier

я же пояснил, почему я про него вспомнил

Любовь зла, полюбишь и то, что у меня на аватарке.

no-such-file ★★★★★
()

нормальные функции округления есть ТОЛЬКО в сишке

в другие языки завезли наркоманов с альтернативным мозгом (ява, жс в том числе)

anonymous
()
Ответ на: комментарий от anonymous

пример:

${#numbers.formatDecimal(new java.math.BigDecimal((number).toString()).setScale(4, 4).doubleValue(), 1, 'COMMA', 4, 'POINT')}
anonymous
()
Ответ на: комментарий от anonymous

по данному расчету возможно рассчитывать объем крыши и все тому подобное по проектироваию?

____________________________________________

(remoo)

nino123
()
16 декабря 2018 г.

Классическое округление, без использования библиотек. Наслаждайтесь ;)

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
anonymous
()
Ответ на: комментарий от Qwentor

да мне прост интересно было

ой блин, это же некротред

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от NetSurf

До сих пор
Проект не мой, я один из программистов.
Парсится парсерами на питонах, нодах, тисиэлях и хз чем ещё

Qwentor ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.