Как получить числа после запятой?

Ответы:

28

Легкий подход для вас:

number_dec = str(number-int(number))[1:]
lllluuukke
источник
31
Упражнение для читателя: заставьте его работать с числами, большими или равными 10
интуитивно понятен
11
number_dec = str(number-int(number)).split('.')[1]
Райан Аллен
28
Проголосуйте против, потому что это излишне сложный подход. Ответом, который я искал, был следующий ответ, 5.55 % 1который также является более общим полезным ответом - можно использовать подход деления по модулю на нескольких языках, тогда как приведенный выше ответ зависит от Python.
Stew
3
ПРИМЕЧАНИЕ. Это решение возвращает строку, содержащую точку ( .55), чего вы не можете ожидать из-за заголовка вопроса!
T. Christiansen
9
str(5.55 - int(5.55))[1:]возвращается .5499999999999998вместо .55упомянутого в вопросе.
Cristian Ciupitu
201
5.55 % 1

Имейте в виду, что это не поможет вам с проблемами округления с плавающей запятой. Т.е. вы можете получить:

0.550000000001

Или, иначе, немного ниже ожидаемых 0,55.

жер
источник
7
Что касается modf, он также может math.modf(5.55)повлиять на точность: вернет (0,5499999999999998, 5,0).
bereal 05
1
Кто-нибудь знает, какая операция будет быстрее, этот метод, описанный выше, или: float b = a - int (a)? Я подозреваю, что позже, но хотел посмотреть, есть ли подтверждение
hokkuk
5
На Raspberry Pi этот метод x%1был почти в два раза быстрее , как x-int(x)и modf(x)[0]методы (тайминги были 980ns, 1.39us и 1.47us в среднем более 1 млн прогонов). Моя оценка xвсегда была положительной, поэтому мне не о чем беспокоиться.
coderforlife
Однозначно модуль работает быстрее. Ему не нужно искать имена. В то время как вызов функции int выполняет поиск глобальных переменных.
Энрико Борба
представьте себе не просто трещину ()
got mckenzm
155

Используйте modf :

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
Энтони V
источник
2
Хорошее решение, но math.modf(2.53) = (0.5299999999999998, 2.0)ожидаемый ответ - 0,53
Лорд Ло.
4
@LordLoh. это из-за округления с плавающей запятой и произойдет с любым методом.
Rena
@LordLoh. Попробуйте использовать round (0,5299999999999998, 2), чтобы получить 0,53. Другой способ - использовать Decimal из decimal пакета. docs.python.org/2/library/decimal.html
SirJ
57

Что о:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

Или, используя numpy:

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Джим Бриссом
источник
33

Используя decimalмодуль из стандартной библиотеки, вы можете сохранить исходную точность и избежать проблем с округлением с плавающей запятой:

>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')

Как добрые примечания в комментариях, вам floatсначала нужно преобразовать родные s в строки.

созерцаемое
источник
В интересах исходного автора вопросов: числа с плавающей запятой необходимо преобразовать в строки, прежде чем их можно будет преобразовать в десятичные числа. Итак, если у вас есть n = 5.55, n - это число с плавающей запятой, и вы должны это сделать, Decimal(str(n)) % 1чтобы получить дробную часть. (В этом нет необходимости, если у вас есть целое число, но это не повредит.)
kindall
2
@intuited: Он не обязательно должен быть десятичным, он работает также и с плавающей точкой: 10.0/3 % 1по крайней мере, в моей системе
aherok
2
Вы можете использовать from_float вместо строки. d = Decimal.from_float (1.2)
Мэтью Пёрдон,
@intuited Как получить десятичную часть как целое число? Я пробовал использовать методы to_integer (), но тип все еще Decimal.
D1X
1
@MatthewPurdon - если вы используете Decimal.from_float(1.2)(что теперь можно записать как Decimal(1.2)), у вас будут проблемы с округлением, которых этот ответ пытался избежать.
John Y
7

Попробуйте Modulo:

5.55%1 = 0.54999999999999982
Юри Робл
источник
5

аналогично принятому ответу, даже более простой подход с использованием строк будет

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
yosemite_k
источник
number = 5.55; "." in numberдает TypeError: argument of type 'float' is not iterable. А что бы вы сделали, если бы number = 1e-5?
Марк Дикинсон
@ отметьте вопрос: как получить числа после десятичной точки? поэтому пользователь ожидает числа с плавающей запятой в десятичном представлении (не в научном представлении), я также добавил блок для научного представления
yosemite_k
Число - это число; это только представление числа, которое может быть в научной записи. Так что «float в десятичной системе счисления» здесь не имеет особого смысла; к тому времени, когда Python увидит это, это будет просто float; Python не хранит никаких сведений о том, в каком формате он был первоначально выражен. Мой number = 1e-5пример одинаково хорошо применим к number = 0.00001: strпредставление числа в научном представлении. Вы хотите иметь дело с e+, а также e-, кстати.
Марк Дикинсон
4
import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55
Кевин Лакмэн
источник
>>> frac 0.5499999999999998
macm
4
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55
ghostdog74
источник
2
Это нормально для чисел садового разнообразия, но не так хорошо для чисел, больших (или малых), которые требуют научного обозначения.
kindall 08
2

Это решение, которое я пробовал:

num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))
Курьян
источник
2

Иногда имеют значение завершающие нули

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)
Джордж Фишер
источник
что это значит для 0,000005?
Адитья Патнаик,
2

Просто используя простое операторное деление '/' и разделение полов '//', вы можете легко получить дробную часть любого заданного числа с плавающей запятой.

number = 5.55

result = (number/1) - (number//1)

print(result)
Sony
источник
1

Используйте пол и вычтите результат из исходного числа:

>> 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

источник
5
Если вы собираетесь import math, почему бы просто не использовать math.modf()?
ire_and_curses
@ire_and_curses: Я предлагаю альтернативное решение проблемы.
1
floor делает то же самое, что и приведение к int, поэтому можно заменить math.floor (t) на int (t)
QuantumKarl
@QuantumKarl Нет, они разные. math.floor(-1.1) == -2но int(-1.1) == -1. Хотя для этого вопроса intправильнее использовать.
Lambda Fairy
1

Числа с плавающей запятой не хранятся в десятичном формате (base10). Прочтите документацию по Python по этому поводу, чтобы понять, почему. Поэтому получать представление base10 из числа с плавающей запятой не рекомендуется.

Теперь есть инструменты, позволяющие хранить числовые данные в десятичном формате. Ниже приведен пример использования Decimalбиблиотеки.

from decimal import *

x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66'  # True

y = 0.341343214124443151466
str(y)[-2:] == '66'  # False
JPP
источник
1

Пример:

import math
x = 5.55
print((math.floor(x*100)%100))

Это даст вам два числа после десятичной точки, 55 из этого примера. Если вам нужно одно число, вы уменьшите на 10 вышеуказанные вычисления или увеличьте в зависимости от того, сколько чисел вы хотите после запятой.

Фрэнк
источник
Это хорошо, потому что он возвращает не дробное значение, но разбивается на отрицательные числа
Мяу,
К сожалению, в большинстве случаев это не работает. @Meow
Marquis of Lorne
1
import math

x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )

Это определенно сработало

Али
источник
что означает оператор //?
l --''''''--------- '' '' '' '' '' ''
0

Что о:

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.

MH
источник
Любое объяснение?
0

Вы можете попробовать это:

your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])

Он вернется 0.55.

Ашкан Мирзаи
источник
0
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)

выход: 0,55

Санчит Алуна
источник
0

Посмотрите, что я часто делаю для получения чисел после десятичной точки в python 3:

a=1.22
dec=str(a).split('.')
dec= int(dec[1])
Сурадж Рао
источник
0

Если вы используете панды:

df['decimals'] = df['original_number'].mod(1)
erickfis
источник
0

Другой вариант - использовать 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?

Эмма
источник
0

Я обнаружил, что действительно большие числа с действительно большими дробными частями могут вызвать проблемы при использовании по модулю 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')
Droogans
источник
0

Другой пример с использованием 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
camilom108
источник
0

Решение использует модуль и округление.

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

Гидеон Антви
источник
0

Вы можете использовать это:

number = 5.55
int(str(number).split('.')[1])
Марио Монрой
источник
-2

Еще одно безумное решение (без преобразования в строку):

number = 123.456
temp = 1

while (number*temp)%10 != 0:
    temp = temp *10
    print temp
    print number

temp = temp /10
number = number*temp
number_final = number%temp
print number_final
Ромул
источник