Come ottenere i numeri dopo il punto decimale?


Risposte:


28

Un approccio facile per te:

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

30
Esercizio per il lettore: fallo funzionare per numeri maggiori o uguali a 10
intuito il

11
number_dec = str(number-int(number)).split('.')[1]
Ryan Allen

28
Downvote perché questo è un approccio inutilmente complicato. La risposta che ho cercato è stata la risposta successiva 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.
Stufato

3
NOTA: questa soluzione restituisce una stringa che include il punto ( .55), che potresti non aspettarti a causa del titolo della domanda!
T. Christiansen

8
str(5.55 - int(5.55))[1:]restituisce .5499999999999998invece di quanto .55menzionato nella domanda.
Cristian Ciupitu

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


7
Per quanto riguarda modf, può anche rovinare la precisione: math.modf(5.55)tornerà (0,5499999999999998, 5,0).
bereal

1
qualcuno sa quale sarebbe l'operazione più veloce, questo metodo descritto sopra, o: float b = a - int (a)? sospetto il dopo, ma volevo vedere se c'era la conferma
hokkuk

4
Su un Raspberry Pi questo metodo x%1era 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 xera sempre positivo, quindi non dovevo preoccuparmene.
coderforlife

Sicuramente il funzionamento del modulo è più veloce. Non è necessario eseguire ricerche di nomi. Mentre la chiamata alla funzione int esegue una ricerca sulle variabili globali.
Enrico Borba

non solo avere un frac ()
mckenzm

155

Usa modf :

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

2
Buona soluzione, ma la math.modf(2.53) = (0.5299999999999998, 2.0)risposta prevista è 0,53
Lord Loh.

4
@LordLoh. ciò è dovuto all'arrotondamento in virgola mobile e accadrà con qualsiasi metodo.
Rena

@LordLoh. Prova a utilizzare round (0,5299999999999998, 2) per ottenere 0,53 Un altro modo è utilizzare Decimal dal pacchetto decimale. docs.python.org/2/library/decimal.html
SirJ

57

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)

33

Utilizzando il decimalmodulo 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 floats in stringhe prima.


A vantaggio di chi pone la domanda originale: i float devono essere convertiti in stringhe prima di poter essere convertiti in decimali. Quindi, se lo hai n = 5.55, n è un float e dovresti farlo Decimal(str(n)) % 1per ottenere la parte frazionaria. (Questo non è necessario se hai un numero intero, ma non fa male.)
kindall

2
@intuited: non ha bisogno di essere decimale, funziona anche per float: 10.0/3 % 1almeno sul mio sistema
aherok

2
Puoi usare from_float invece di usare una stringa. d = Decimal.from_float (1.2)
Matthew Purdon

@intuited Come si ottiene la parte decimale come numero intero? Ho provato i metodi to_integer () ma il tipo è ancora Decimal.
D1X

1
@MatthewPurdon - Se usi 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.
John Y


5

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 numberTypeError: argument of type 'float' is not iterable. E cosa faresti se number = 1e-5?
Mark Dickinson

@ Contrassegnare la domanda è Come ottengo i numeri dopo un punto decimale? quindi l'utente si aspetta un float in notazione decimale (non notazione scientifica), ho aggiunto anche un blocco per la notazione scientifica
yosemite_k

Un numero è un numero; sono solo rappresentazioni di un numero che potrebbe essere in notazione scientifica. Quindi "float in notazione decimale" non ha molto senso qui; quando Python lo vede, è solo un float; Python non mantiene alcuna conoscenza del formato in cui è stato originariamente espresso. Il mio number = 1e-5esempio si applica ugualmente bene a number = 0.00001: la strrappresentazione del numero è in notazione scientifica. Avrai voglia di occuparti e+così come e-, a proposito.
Mark Dickinson

4
import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55

>>> frac 0.549999999999999998
macm

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

2
Questo va bene per i numeri di varietà da giardino, ma non funziona così bene per numeri grandi (o piccoli) abbastanza da richiedere la notazione scientifica.
kindall

2

Questa è una soluzione che ho provato:

num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))

2

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)

cosa fa per 0,000005?
Aditya Patnaik

2

Usando semplicemente la divisione dell'operatore "/" e la divisione del piano "//" puoi ottenere facilmente la parte frazionaria di un dato float.

number = 5.55

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

print(result)

1

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

5
Se hai intenzione di farlo import math, perché non usarlo math.modf()?
ire_and_curses

@ire_and_curses: sto fornendo una soluzione alternativa al problema.

1
floor fa la stessa cosa del casting su un int, quindi potrebbe sostituire math.floor (t) con int (t)
QuantumKarl

@QuantumKarl No, sono diversi. math.floor(-1.1) == -2ma int(-1.1) == -1. Sebbene per questa domanda l'uso intsia più corretto.
Lambda Fairy

1

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

from decimal import *

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

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

1

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.


Questo è utile perché restituisce un valore non frazionario, ma si interromperà su numeri negativi
Meow

Purtroppo la maggior parte delle volte non funziona. @Meow
Marchese di Lorne


0

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.


Alcuna spiegazione?

0

Potresti provare questo:

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

Tornerà 0.55.


0
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)

uscita: 0,55


0

Guarda cosa faccio spesso per ottenere numeri dopo il punto decimale in Python 3:

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

0

Se stai usando i panda:

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

0

Un'altra opzione potrebbe essere quella di utilizzare il remodulo con re.findallo 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))

Produzione

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.


fonte

Come sbarazzarsi di numeri mobili aggiuntivi nella sottrazione di Python?


0

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

0

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

0

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



-2

Un'altra soluzione folle è (senza convertire in una stringa):

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.