Wie bekomme ich Zahlen nach dem Komma?

Antworten:

30

Ein einfacher Ansatz für Sie:

number_dec = str(number-int(number))[1:]
lllluuukke
quelle
30
Übung für den Leser:
Lassen Sie
10
number_dec = str(number-int(number)).split('.')[1]
Ryan Allen
26
Downvote, weil dies ein unnötig komplizierter Ansatz ist. Die Antwort, die ich suchte, war die nächste Antwort, 5.55 % 1die auch eine allgemein nützlichere Antwort ist - man kann den Modulo-Divisionsansatz in mehreren Sprachen verwenden, während die obige Antwort Python-spezifisch ist.
Eintopf
3
HINWEIS: Diese Lösung gibt eine Zeichenfolge mit dem Punkt ( .55) zurück, die Sie aufgrund des Fragentitels möglicherweise nicht erwarten!
T. Christiansen
8
str(5.55 - int(5.55))[1:]kehrt .5499999999999998anstelle der .55in der Frage genannten zurück.
Cristian Ciupitu
197
5.55 % 1

Beachten Sie, dass dies bei Gleitkomma-Rundungsproblemen nicht hilfreich ist. Dh Sie können bekommen:

0.550000000001

Oder ansonsten ein wenig von den 0,55, die Sie erwarten.

jer
quelle
7
Wie für modf, kann es auch die Präzision schrauben: math.modf(5.55)wird zurückkehren (0,5499999999999998, 5,0).
Bereal
1
Weiß jemand, welche Operation schneller wäre, diese oben beschriebene Methode, oder: float b = a - int (a)? Ich vermute das später, wollte aber sehen, ob es eine Bestätigung gab
Hokkuk
4
Auf einem Raspberry Pi war diese Methode x%1fast doppelt so schnell wie die x-int(x)und- modf(x)[0]Methoden (die Timings betrugen 980 ns, 1,39 us und 1,47 us, gemittelt über 1000000 Läufe). Mein Wert für xwar immer positiv, also musste ich mir darüber keine Sorgen machen.
Coderforlife
Auf jeden Fall ist der Modulbetrieb schneller. Es müssen keine Namenssuchen durchgeführt werden. Während der Aufruf der int-Funktion eine Suche nach den globalen Variablen durchführt.
Enrico Borba
Lust nicht nur einen frac () zu haben
mckenzm
154

Verwenden Sie modf :

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
Anthony V.
quelle
2
Gute Lösung, aber math.modf(2.53) = (0.5299999999999998, 2.0)erwartete Antwort ist 0,53
Lord Loh.
4
@ LordLoh. Das liegt an der Gleitkomma-Rundung und wird bei jeder Methode auftreten.
Rena
@ LordLoh. Versuchen Sie, round (0.5299999999999998, 2) zu verwenden, um 0.53 zu erhalten. Eine andere Möglichkeit besteht darin, Dezimal aus dem Dezimalpaket zu verwenden. docs.python.org/2/library/decimal.html
SirJ
57

Wie wäre es mit:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

Oder mit numpy:

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Jim Brissom
quelle
33

Mit dem decimalModul aus der Standardbibliothek können Sie die ursprüngliche Genauigkeit beibehalten und Gleitkomma-Rundungsprobleme vermeiden:

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

Wie Kindall Hinweise in den Kommentaren, werden Sie nativer konvertieren müssen floatzuerst s in Strings.

intuitiv
quelle
Zum Nutzen des ursprünglichen Fragestellers: Floats müssen in Zeichenfolgen konvertiert werden, bevor sie in Dezimalzahlen konvertiert werden können. Wenn Sie also haben n = 5.55, ist n ein Float, und Sie sollten tun Decimal(str(n)) % 1, um den Bruchteil zu erhalten. (Dies ist nicht notwendig, wenn Sie eine Ganzzahl haben, aber es tut nicht weh.)
Kindall
2
@intuited: Es muss nicht dezimal sein, es funktioniert auch für float: 10.0/3 % 1zumindest auf meinem System
Aherok
2
Sie können from_float anstelle einer Zeichenfolge verwenden. d = Decimal.from_float (1.2)
Matthew Purdon
@intuited Wie erhält man den Dezimalteil als Ganzzahl? Ich habe versucht, Methoden to_integer (), aber der Typ ist immer noch Dezimal.
D1X
1
@MatthewPurdon - Wenn Sie verwenden Decimal.from_float(1.2)(was jetzt als geschrieben werden kann Decimal(1.2)), treten Rundungsprobleme auf, die durch diese Antwort vermieden werden sollten .
John Y
7

Versuchen Sie Modulo:

5.55%1 = 0.54999999999999982
Juri Robl
quelle
5

Ähnlich wie bei der akzeptierten Antwort wäre ein noch einfacherer Ansatz mit Zeichenfolgen

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
quelle
number = 5.55; "." in numbergibt TypeError: argument of type 'float' is not iterable. Und was würden Sie tun, wenn number = 1e-5?
Mark Dickinson
@mark die Frage ist Wie bekomme ich die Zahlen nach einem Dezimalpunkt? Da der Benutzer Float in Dezimalschreibweise erwartet (keine wissenschaftliche Notation), habe ich auch einen Block für die wissenschaftliche Notation hinzugefügt
yosemite_k
Eine Zahl ist eine Zahl; Es sind nur Darstellungen einer Zahl, die möglicherweise in wissenschaftlicher Notation vorliegen. "Float in Dezimalschreibweise" macht hier also wenig Sinn; Wenn Python es sieht, ist es nur ein float; Python weiß nicht, in welchem ​​Format es ursprünglich ausgedrückt wurde. Mein number = 1e-5Beispiel gilt ebenso gut für number = 0.00001: Die strDarstellung der Zahl erfolgt in wissenschaftlicher Notation. Sie werden mit beschäftigen möchten e+sowie e-von der Art und Weise.
Mark Dickinson
4
import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55
Kevin Lacquement
quelle
>>> frac 0.5499999999999998
macm
4
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55
Ghostdog74
quelle
2
Dies ist für Gartensortennummern in Ordnung, funktioniert jedoch nicht so gut für Zahlen, die groß (oder klein) genug sind, um eine wissenschaftliche Notation zu erfordern.
Kindall
2

Dies ist eine Lösung, die ich versucht habe:

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

Manchmal sind nachgestellte Nullen wichtig

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)
George Fisher
quelle
Was bedeutet das für 0,000005?
Aditya Patnaik
1

Verwenden Sie Boden und subtrahieren Sie das Ergebnis von der ursprünglichen Zahl:

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

quelle
5
Wenn Sie gehen import math, warum nicht einfach verwenden math.modf()?
ire_and_curses
@ire_and_curses: Ich biete eine alternative Lösung für das Problem.
1
Floor macht das gleiche wie das Casting auf ein Int, könnte also math.floor (t) durch int (t) ersetzen
QuantumKarl
@QuantumKarl Nein, sie sind unterschiedlich. math.floor(-1.1) == -2aber int(-1.1) == -1. Für diese Frage ist die Verwendung intjedoch korrekter.
Lambda Fairy
1

Gleitkommazahlen werden nicht im Dezimalformat (base10) gespeichert. Lesen Sie die Python-Dokumentation dazu durch, um sich selbst davon zu überzeugen, warum. Daher ist es nicht ratsam, eine base10-Darstellung von einem Float zu erhalten.

Jetzt gibt es Tools, mit denen numerische Daten im Dezimalformat gespeichert werden können. Unten finden Sie ein Beispiel für die Verwendung der DecimalBibliothek.

from decimal import *

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

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

Beispiel:

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

Dies gibt Ihnen zwei Zahlen nach dem Dezimalpunkt, 55 aus diesem Beispiel. Wenn Sie eine Zahl benötigen, reduzieren Sie die obigen Berechnungen um 10 oder erhöhen sie, je nachdem, wie viele Zahlen Sie nach der Dezimalstelle haben möchten.

Frank
quelle
Das ist schön, weil es einen nicht gebrochenen Wert zurückgibt, aber bei negativen Zahlen bricht
Meow
Leider funktioniert es die meiste Zeit nicht. @ Meow
Marquis von Lorne
1
import math

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

Es hat definitiv funktioniert

Ali
quelle
Was bedeutet der Operator //?
l - '' '' '
1

Mit der einfachen Operator- Division '/' und der Floor-Division '//' können Sie leicht den Bruchteil eines bestimmten Schwimmers erhalten.

number = 5.55

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

print(result)
Sony
quelle
0

Wie wäre es mit:

a = 1.234
b = a - int(a)
length = len(str(a))

round(b, length-2)

Ausgabe:
print(b)
0.23399999999999999
round(b, length-2)
0.234

Da die Runde an die Länge der Dezimalzeichenfolge ('0,234') gesendet wird, können wir nur minus 2, um die '0' nicht zu zählen, und die gewünschte Anzahl von Dezimalstellen ermitteln. Dies sollte meistens funktionieren, es sei denn, Sie haben viele Dezimalstellen und der Rundungsfehler bei der Berechnung von b stört den zweiten Parameter der Runde.

MH
quelle
Irgendeine Erklärung?
0

Vielleicht möchten Sie dies versuchen:

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

Es wird zurückkehren 0.55.

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

Ausgabe: 0,55

Sanchit Aluna
quelle
0

Sehen Sie, was ich oft mache, um Zahlen nach dem Dezimalpunkt in Python 3 zu erhalten:

a=1.22
dec=str(a).split('.')
dec= int(dec[1])
Suraj Rao
quelle
0

Wenn Sie Pandas verwenden:

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

Eine andere Möglichkeit wäre, das reModul mit re.findalloder zu verwenden 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))

Ausgabe

0.55
0.55
5

Wenn Sie den Ausdruck vereinfachen / ändern / untersuchen möchten, wurde dies im oberen rechten Bereich von regex101.com erläutert . Wenn Sie möchten , können Sie in diesem Link auch sehen , wie es mit einigen Beispieleingaben übereinstimmt.


Quelle

Wie werden zusätzliche schwebende Zahlen bei der Python-Subtraktion entfernt?

Emma
quelle
0

Ich habe festgestellt, dass sehr große Zahlen mit sehr großen Bruchteilen Probleme verursachen können, wenn Modulo 1 verwendet wird, um den Bruch zu erhalten.

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

Ich griff stattdessen nach dem integralen Teil und subtrahierte ihn zuerst, um den Rest zu vereinfachen.

>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Droogans
quelle
0

Ein weiteres Beispiel mit 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
quelle
0

Eine Lösung ist Modulo und Rundung.

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

Ihre Ausgabe wird 0,55 sein

Gideon Antwi
quelle
0

Sie können dies verwenden:

number = 5.55
int(str(number).split('.')[1])
Mario Monroy
quelle
-2

Eine andere verrückte Lösung ist (ohne in einen String zu konvertieren):

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