Come ottengo i numeri dopo un punto decimale?
Ad esempio, se ce l'ho 5.55
, come posso ottenerlo .55
?
Come ottengo i numeri dopo un punto decimale?
Ad esempio, se ce l'ho 5.55
, come posso ottenerlo .55
?
Risposte:
Un approccio facile per te:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
, che è anche una risposta più generalmente utile: si può usare l'approccio della divisione modulo in più lingue, mentre la risposta sopra è specifica di Python.
.55
), che potresti non aspettarti a causa del titolo della domanda!
str(5.55 - int(5.55))[1:]
restituisce .5499999999999998
invece di quanto .55
menzionato nella domanda.
5.55 % 1
Tieni presente che questo non ti aiuterà con i problemi di arrotondamento in virgola mobile. Vale a dire, potresti ottenere:
0.550000000001
O altrimenti un po 'fuori dallo 0,55 che ti aspetti.
modf
, può anche rovinare la precisione: math.modf(5.55)
tornerà (0,5499999999999998, 5,0).
x%1
era quasi il doppio più veloce dei metodi x-int(x)
e modf(x)[0]
(i tempi erano 980ns, 1.39us e 1.47us in media su 1000000 corse). Il mio valore per x
era sempre positivo, quindi non dovevo preoccuparmene.
Usa modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
risposta prevista è 0,53
Che dire:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
Oppure, usando numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Utilizzando il decimal
modulo della libreria standard, è possibile mantenere la precisione originale ed evitare problemi di arrotondamento in virgola mobile:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Come Kindall note nei commenti, dovrete convertire i nativi float
s in stringhe prima.
n = 5.55
, n è un float e dovresti farlo Decimal(str(n)) % 1
per ottenere la parte frazionaria. (Questo non è necessario se hai un numero intero, ma non fa male.)
10.0/3 % 1
almeno sul mio sistema
Decimal.from_float(1.2)
(che ora può essere scritto come Decimal(1.2)
) avrai problemi di arrotondamento, che questa risposta stava cercando di evitare.
simile alla risposta accettata, sarebbe un approccio ancora più semplice usando le stringhe
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
dà TypeError: argument of type 'float' is not iterable
. E cosa faresti se number = 1e-5
?
float
; Python non mantiene alcuna conoscenza del formato in cui è stato originariamente espresso. Il mio number = 1e-5
esempio si applica ugualmente bene a number = 0.00001
: la str
rappresentazione del numero è in notazione scientifica. Avrai voglia di occuparti e+
così come e-
, a proposito.
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
A volte gli zeri finali contano
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)
Usa floor e sottrai il risultato dal numero originale:
>> 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
, perché non usarlo math.modf()
?
math.floor(-1.1) == -2
ma int(-1.1) == -1
. Sebbene per questa domanda l'uso int
sia più corretto.
I numeri in virgola mobile non vengono memorizzati in formato decimale (base10). Leggi la documentazione di Python su questo per capire perché. Pertanto, non è consigliabile ottenere una rappresentazione in base10 da un float.
Ora ci sono strumenti che consentono l'archiviazione di dati numerici in formato decimale. Di seguito è riportato un esempio che utilizza la Decimal
libreria.
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Esempio:
import math
x = 5.55
print((math.floor(x*100)%100))
Questo ti darà due numeri dopo il punto decimale, 55 da quell'esempio. Se hai bisogno di un numero, riduci di 10 i calcoli sopra o aumenta a seconda di quanti numeri vuoi dopo il decimale.
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
Sicuramente ha funzionato
Che dire:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
Produzione:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Poiché il round viene inviato alla lunghezza della stringa di decimali ("0,234"), possiamo semplicemente meno 2 per non contare lo "0" e calcolare il numero di punti decimali desiderato. Questo dovrebbe funzionare la maggior parte delle volte, a meno che tu non abbia molte cifre decimali e l'errore di arrotondamento durante il calcolo di b interferisca con il secondo parametro di round.
Potresti provare questo:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Tornerà 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
uscita: 0,55
Un'altra opzione potrebbe essere quella di utilizzare il re
modulo con re.findall
o 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
Se desideri semplificare / modificare / esplorare l'espressione, è stato spiegato nel pannello in alto a destra di regex101.com . Se lo desideri, puoi anche guardare in questo link , come corrisponderebbe ad alcuni input di esempio.
Come sbarazzarsi di numeri mobili aggiuntivi nella sottrazione di Python?
Ho scoperto che numeri molto grandi con parti frazionarie molto grandi possono causare problemi quando si utilizza il modulo 1 per ottenere la frazione.
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'>]
Invece ho preso la parte integrale e l'ho sottratta prima per semplificare il resto.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Un altro esempio di utilizzo di 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
Una soluzione sta usando modulo e arrotondamento.
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)))
Il tuo output sarà 0,55
Puoi usare questo:
number = 5.55
int(str(number).split('.')[1])