Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 6, 2018 20:51:59

amateur
Зарегистрирован: 2018-09-06
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

округление числа с плавающей точкой вниз с заданной точностью

round(number) округляет с заданной точность к ближайшему.
А как округлить число с плавающей точкой вниз с заданной точностью?

Офлайн

#2 Сен. 7, 2018 00:42:28

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

округление числа с плавающей точкой вниз с заданной точностью

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



Офлайн

#3 Сен. 7, 2018 00:49:57

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

округление числа с плавающей точкой вниз с заданной точностью

Либо воспользоваться модулем decimal. quantize и ROUND_DOWN помогут



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Сен. 7, 2018 11:46:04

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

округление числа с плавающей точкой вниз с заданной точностью

> А как округлить число с плавающей точкой вниз с заданной точностью?

Как-то так:

 from math import floor
>>> floor(2.75)
2.0
def floor2(n, m):
     return round(floor(n)+round(n - floor(n), m), m)

> Либо воспользоваться модулем decimal.

В этом модуле сидит ловушка:
 >>> from decimal import Decimal, getcontext
>>> getcontext().prec = 2
>>> Decimal("22") / Decimal("7")
Decimal('3.1')
>>> Decimal("220") / Decimal("7")
Decimal('31')
Т.е. его автор является столь одарённым человеком что он решил задавать точность вычислений не как количество знаков после запятой, а как количество знаков в числе. К тому же он ещё может и считать не правильно:
 >>> 220*7
1540
>>> getcontext().prec = 2
>>> int(Decimal("220") * Decimal("7"))
1500
>>> int(Decimal("221.5") * Decimal("7"))
1600
Это происходит из-за того же кривого округления. Decimal хранит свои значения как экспоненциальное число: 220 * 7 это 1,54E3 и Decimal округляет его до 1,5E3 отсюда и ошибка.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Сен. 7, 2018 12:49:33)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version