Як отримати цифри після десяткових знаків?
Наприклад, якщо я маю 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
Іноді значення нульових значень мають значення
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
правильніше.
Плаваючі числа не зберігаються у десятковому (базовому10) форматі. Прочитайте документацію 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 втручається у другий параметр раунду.
Ви можете спробувати це:
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
Іншим варіантом буде використання 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 . Якщо ви хочете, ви також можете подивитися за цим посиланням , як це буде відповідати деяким зразкам даних.
Як позбутися додаткових плаваючих чисел у відніманні пітона?
Я виявив, що дійсно велика кількість з дійсно великими дробовими частинами може спричинити проблеми при використанні модуля 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])