Как получить числа после десятичной точки?
Например, если есть 5.55
, как мне получить .55
?
Как получить числа после десятичной точки?
Например, если есть 5.55
, как мне получить .55
?
Ответы:
Легкий подход для вас:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
который также является более общим полезным ответом - можно использовать подход деления по модулю на нескольких языках, тогда как приведенный выше ответ зависит от Python.
.55
), чего вы не можете ожидать из-за заголовка вопроса!
str(5.55 - int(5.55))[1:]
возвращается .5499999999999998
вместо .55
упомянутого в вопросе.
5.55 % 1
Имейте в виду, что это не поможет вам с проблемами округления с плавающей запятой. Т.е. вы можете получить:
0.550000000001
Или, иначе, немного ниже ожидаемых 0,55.
modf
, он также может math.modf(5.55)
повлиять на точность: вернет (0,5499999999999998, 5,0).
x%1
был почти в два раза быстрее , как x-int(x)
и modf(x)[0]
методы (тайминги были 980ns, 1.39us и 1.47us в среднем более 1 млн прогонов). Моя оценка x
всегда была положительной, поэтому мне не о чем беспокоиться.
Используйте modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
ожидаемый ответ - 0,53
Что о:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
Или, используя numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Используя decimal
модуль из стандартной библиотеки, вы можете сохранить исходную точность и избежать проблем с округлением с плавающей запятой:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Как добрые примечания в комментариях, вам float
сначала нужно преобразовать родные s в строки.
n = 5.55
, n - это число с плавающей запятой, и вы должны это сделать, Decimal(str(n)) % 1
чтобы получить дробную часть. (В этом нет необходимости, если у вас есть целое число, но это не повредит.)
10.0/3 % 1
по крайней мере, в моей системе
Decimal.from_float(1.2)
(что теперь можно записать как Decimal(1.2)
), у вас будут проблемы с округлением, которых этот ответ пытался избежать.
аналогично принятому ответу, даже более простой подход с использованием строк будет
def number_after_decimal(number1):
number = str(number1)
if 'e-' in number: # scientific notation
number_dec = format(float(number), '.%df'%(len(number.split(".")[1].split("e-")[0])+int(number.split('e-')[1])))
elif "." in number: # quick check if it is decimal
number_dec = number.split(".")[1]
return number_dec
number = 5.55; "." in number
дает TypeError: argument of type 'float' is not iterable
. А что бы вы сделали, если бы number = 1e-5
?
float
; Python не хранит никаких сведений о том, в каком формате он был первоначально выражен. Мой number = 1e-5
пример одинаково хорошо применим к number = 0.00001
: str
представление числа в научном представлении. Вы хотите иметь дело с e+
, а также e-
, кстати.
import math
orig = 5.55
whole = math.floor(orig) # whole = 5.0
frac = orig - whole # frac = 0.55
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
Иногда имеют значение завершающие нули
In [4]: def split_float(x):
...: '''split float into parts before and after the decimal'''
...: before, after = str(x).split('.')
...: return int(before), (int(after)*10 if len(after)==1 else int(after))
...:
...:
In [5]: split_float(105.10)
Out[5]: (105, 10)
In [6]: split_float(105.01)
Out[6]: (105, 1)
In [7]: split_float(105.12)
Out[7]: (105, 12)
Используйте пол и вычтите результат из исходного числа:
>> import math #gives you floor.
>> t = 5.55 #Give a variable 5.55
>> x = math.floor(t) #floor returns t rounded down to 5..
>> z = t - x #z = 5.55 - 5 = 0.55
import math
, почему бы просто не использовать math.modf()
?
math.floor(-1.1) == -2
но int(-1.1) == -1
. Хотя для этого вопроса int
правильнее использовать.
Числа с плавающей запятой не хранятся в десятичном формате (base10). Прочтите документацию по Python по этому поводу, чтобы понять, почему. Поэтому получать представление base10 из числа с плавающей запятой не рекомендуется.
Теперь есть инструменты, позволяющие хранить числовые данные в десятичном формате. Ниже приведен пример использования Decimal
библиотеки.
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Пример:
import math
x = 5.55
print((math.floor(x*100)%100))
Это даст вам два числа после десятичной точки, 55 из этого примера. Если вам нужно одно число, вы уменьшите на 10 вышеуказанные вычисления или увеличьте в зависимости от того, сколько чисел вы хотите после запятой.
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
Это определенно сработало
Что о:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
Вывод:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Поскольку округление отправляется на длину строки десятичных знаков ('0,234'), мы можем просто минус 2, чтобы не считать "0", и вычислить желаемое количество десятичных знаков. Это должно работать в большинстве случаев, если у вас нет большого количества десятичных знаков и ошибка округления при вычислении b мешает второму параметру round.
Вы можете попробовать это:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Он вернется 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
выход: 0,55
Посмотрите, что я часто делаю для получения чисел после десятичной точки в python 3:
a=1.22
dec=str(a).split('.')
dec= int(dec[1])
Другой вариант - использовать re
модуль с re.findall
или re.search
:
import re
def get_decimcal(n: float) -> float:
return float(re.search(r'\.\d+', str(n)).group(0))
def get_decimcal_2(n: float) -> float:
return float(re.findall(r'\.\d+', str(n))[0])
def get_int(n: float) -> int:
return int(n)
print(get_decimcal(5.55))
print(get_decimcal_2(5.55))
print(get_int(5.55))
0.55
0.55
5
Если вы хотите упростить / изменить / изучить выражение, это объясняется на верхней правой панели regex101.com . Если хотите, вы также можете посмотреть по этой ссылке , как это будет соответствовать некоторым образцам входных данных.
Как избавиться от дополнительных чисел с плавающей запятой при вычитании Python?
Я обнаружил, что действительно большие числа с действительно большими дробными частями могут вызвать проблемы при использовании по модулю 1 для получения дроби.
import decimal
>>> d = decimal.Context(decimal.MAX_PREC).create_decimal(
... '143000000000000000000000000000000000000000000000000000000000000000000000000000.1231200000000000000002013210000000'
... )
...
>>> d % 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
Вместо этого я взял составную часть и сначала вычел ее, чтобы упростить остальную часть.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Другой пример с использованием modf
from math import modf
number = 1.0124584
# [0] decimal, [1] integer
result = modf(number)
print(result[0])
# output = 0124584
print(result[1])
# output = 1
Решение использует модуль и округление.
import math
num = math.fabs(float(5.55))
rem = num % 1
rnd_by = len(str(num)) - len(str(int(num))) - 1
print(str(round(rem,rnd_by)))
Ваш вывод будет 0,55
Вы можете использовать это:
number = 5.55
int(str(number).split('.')[1])