bopoh13
@bopoh13
VBA, Ruby (noob), analytic

Как использовать арифметическое округление вместо банковского, и повысить точность расчётов?

Вопросы тем, кто занимался серьёзными проектами. Как относиться к расчётам переменных float?
import math
print(math.tan(math.pi / 4)) # погрешность 1E-16

Может первый пример слишком жёсткий; можно привести что-нибудь попроще. Например в пределах сотых долей.
print(1.2 - 1) # погрешность 4E-17

a = .1 * 3 # <class 'float'> двойная точность?
print(a, a == 0.3) # погрешность 4E-17

a = round(.1 * 6, 15) # <class 'float'> погрешность 1E-16
print(a, a == 0.6) # погрешность -> 0

И конечно же, используя костыль через функцию round хотелось бы получать предсказуемость результата. Поэтому, есть какая-нибудь функция для вычисления арифметического округления?
list = [2 + float(i) / 100 for i in range(5, 96, 10)] # 2.05 - 2,95
round = [round(i, 1) for i in list] # Банковское округление [0,1,2*,5,6]
# * Несоотвествие с арифметическим округлением только в Python 3.3

Листал руководство. Тестировал на интерпретаторе.
  • Вопрос задан
  • 1154 просмотра
Решения вопроса 1
bobrovskyserg
@bobrovskyserg
Используй decimal, и будет тебе щастье.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@domanskiy
Пользуюсь вот такой простой функцией.
def rd(x, y=0):
    ''' Функция математического округления '''
    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
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы