Як отримати числа після десяткової крапки?


Відповіді:


29

Простий підхід для вас:

number_dec = str(number-int(number))[1:]

30
Вправа для читача: змусьте її працювати для чисел, більших або рівних 10
інтуїтивно,

11
number_dec = str(number-int(number)).split('.')[1]
Райан Аллен

28
Downvote тому, що це надмірно складний підхід. Відповідь, яку я шукав, була наступною відповіддю, 5.55 % 1яка також є більш загальною корисною відповіддю - можна використовувати підхід поділу модулів на декількох мовах, тоді як вищевказана відповідь стосується Python.
Тушковане

3
ПРИМІТКА: Це рішення повертає рядок, що включає крапку ( .55), якої ви, можливо, не очікуєте через заголовок питань!
Т. Крістіансен

8
str(5.55 - int(5.55))[1:]повертається .5499999999999998замість .55згаданого у питанні.
Крістіан Цюпіту

198
5.55 % 1

Пам’ятайте, що це не допоможе вам із проблемами округлення плаваючої точки. Тобто ви можете отримати:

0.550000000001

Або в іншому випадку трохи від 0,55, який ви очікуєте.


7
Що стосується modf, він може також math.modf(5.55)накрутити точність: повернеться (0,5499999999999998, 5,0).
bereal

1
хтось знає, яка була б швидша операція, цей метод, описаний вище, або: float b = a - int (a)? підозрюю пізніше, але хотів подивитися, чи є підтвердження
hokkuk

4
На Raspberry Pi цей метод x%1був майже в два рази швидше , як x-int(x)і modf(x)[0]методи (таймінги були 980ns, 1.39us і 1.47us в середньому більш 1 млн прогонів). Моє значення xзавжди було позитивним, тому мені не довелося через це хвилюватися.
coderforlife

Однозначно робота модуля відбувається швидше. Тут не потрібно робити ніяких пошукових запитів. Тоді як виклик функції int здійснює пошук глобальних змінних.
Енріко Борба

фантазії не просто мати frac ()
mckenzm

155

Використовувати modf :

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0

2
Гарне рішення, але math.modf(2.53) = (0.5299999999999998, 2.0)очікувана відповідь - 0,53
лорд Лох.

4
@LordLoh. це через округлення з плаваючою комою, і це станеться з будь-яким методом
Рена

@LordLoh. Спробуйте скористатися круглим (0,5299999999999998, 2), щоб отримати 0,53 Ще одним способом є використання десяткової частини від десяткового пакету. 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')

Як добродушні зауваження в коментарях, вам доведеться спочатку перетворити рідні floats у рядки.


На користь оригінального запитувача: плавці повинні бути перетворені в рядки, перш ніж вони можуть бути перетворені в Десяткові. Отже, якщо у вас є n = 5.55, n - поплавок, і вам слід зробити, Decimal(str(n)) % 1щоб отримати дробову частину. (Це не потрібно, якщо у вас є ціле число, але воно не болить.)
kindall

2
@intuited: Це не повинно бути десятковою, воно працює і для float: 10.0/3 % 1принаймні в моїй системі
aherok

2
Ви можете використовувати from_float замість рядка. d = Десятична. Від_плава (1.2)
Меттью Пердон

@intuited Як можна отримати десяткову частину як ціле число? Я спробував to_integer () методи, але тип все ще десятковий.
D1X

1
@MatthewPurdon - Якщо ви користуєтесь Decimal.from_float(1.2)(що тепер можна записати як Decimal(1.2)), у вас виникнуть проблеми округлення, яких ця відповідь намагалася уникнути.
Іоанн Y


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

number = 5.55; "." in numberдає TypeError: argument of type 'float' is not iterable. А що б ти зробив, якби number = 1e-5?
Марк Дікінсон

@ позначте питання: Як отримати цифри після десяткових знаків? тому користувач очікує, що плаватиме в десятковій нотації (не наукова нотація), я також додав блок для наукових позначень
yosemite_k

Число - це число; це лише уявлення про число, яке може бути в наукових позначеннях. Отже, "плавати в десятковій нотації" тут не має особливого сенсу; до того часу, як це бачить Python, це просто a float; Python не знає, у якому форматі він був спочатку виражений. Мій number = 1e-5приклад однаково добре стосується number = 0.00001: strпредставлення числа є в науковій нотації. Ви хочете мати справу з e+, а також e-, до речі.
Марк Дікінсон


4
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55

2
Це добре для чисельності садових сортів, але не працює настільки добре для чисел, великих або малих, щоб вимагати наукових позначень.
kindall

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?
Aditya Patnaik

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
пол робить те саме, що і лиття до int, тому може замінити math.floor (t) на int (t)
QuantumKarl

@QuantumKarl Ні, вони різні. math.floor(-1.1) == -2але int(-1.1) == -1. Хоча для цього питання використовувати intправильніше.
Фея Ламбда

1

Плаваючі числа не зберігаються у десятковому (базовому10) форматі. Прочитайте документацію python на цьому, щоб переконатись у тому, чому. Тому отримувати представлення base10 з поплавця не доцільно.

Зараз є інструменти, які дозволяють зберігати числові дані у десятковому форматі. Нижче наводиться приклад використання Decimalбібліотеки.

from decimal import *

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

y = 0.341343214124443151466
str(y)[-2:] == '66'  # False

1

Приклад:

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

Це дасть вам два числа після коми після 55, з цього прикладу. Якщо вам потрібно одне число, ви зменшите на 10 вищенаведені обчислення або збільште залежно від кількості чисел після десяткових.


Це приємно, оскільки воно повертає не дробове значення, але розбивається на негативні числа
Meow

На жаль, вона не працює більшу частину часу. @Meow
Маркіз Лорн


1

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

number = 5.55

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

print(result)

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 втручається у другий параметр раунду.


Будь-яке пояснення?

0

Ви можете спробувати це:

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

Це повернеться 0.55.



0

Подивіться, що я часто роблю для отримання чисел після десяткової крапки в python 3:

a=1.22
dec=str(a).split('.')
dec= int(dec[1])

0

Якщо ви використовуєте панди:

df['decimals'] = df['original_number'].mod(1)

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 . Якщо ви хочете, ви також можете подивитися за цим посиланням , як це буде відповідати деяким зразкам даних.


Джерело

Як позбутися додаткових плаваючих чисел у відніманні пітона?


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

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

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



-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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.