Ответ 1
Вы можете сделать:
def truncate(f, n):
return math.floor(f * 10 ** n) / 10 ** n
Тестирование:
>>> f=1.923328437452
>>> [truncate(f, n) for n in range(7)]
[1.0, 1.9, 1.92, 1.923, 1.9233, 1.92332, 1.923328]
Как я могу взять переменную float и контролировать, как далеко выходит float без round()? Например.
w = float(1.678)
Я хочу взять x и сделать из него следующие переменные.
x = 1.67
y = 1.6
z = 1
Если я использую соответствующие методы round:
x = round(w, 2) # With round I get 1.68
y = round(y, 1) # With round I get 1.7
z = round(z, 0) # With round I get 2.0
Он собирается округлить и изменить числа до такой степени, что мне нечего использовать. Я понимаю, что это вопрос раунда, и он работает правильно. Как мне получить информацию, которая мне нужна в переменных x, y, z, и по-прежнему использовать их в других уравнениях в формате float?
Вы можете сделать:
def truncate(f, n):
return math.floor(f * 10 ** n) / 10 ** n
Тестирование:
>>> f=1.923328437452
>>> [truncate(f, n) for n in range(7)]
[1.0, 1.9, 1.92, 1.923, 1.9233, 1.92332, 1.923328]
Супер простым решением является использование строк
x = float (str (w)[:-1])
y = float (str (w)[:-2])
z = float (str (w)[:-3])
Любое из решений библиотеки с плавающей запятой потребует, чтобы вы уклонились от округления, а использование пол/мощности 10 для выбора десятичных знаков может стать немного волосатым по сравнению с приведенным выше.
Если вам просто нужно контролировать точность в формате
pi = 3.14159265
format(pi, '.3f') #print 3.142 # 3 precision after the decimal point
format(pi, '.1f') #print 3.1
format(pi, '.10f') #print 3.1415926500, more precision than the original
Если вам нужно контролировать точность в арифметике с плавающей запятой
import decimal
decimal.getcontext().prec=4 #4 precision in total
pi = decimal.Decimal(3.14159265)
pi**2 #print Decimal('9.870') whereas '3.142 squared' would be off
- редактировать -
Без "округления", таким образом, обрезая число
import decimal
from decimal import ROUND_DOWN
decimal.getcontext().prec=4
pi*1 #print Decimal('3.142')
decimal.getcontext().rounding = ROUND_DOWN
pi*1 #print Decimal('3.141')