Ondalık basamaktan sonraki sayıları nasıl elde ederim?
Örneğin, varsa 5.55
, nasıl edinirim .55
?
Ondalık basamaktan sonraki sayıları nasıl elde ederim?
Örneğin, varsa 5.55
, nasıl edinirim .55
?
Yanıtlar:
Sizin için kolay bir yaklaşım:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
bu aynı zamanda daha genel olarak kullanışlı bir cevaptır - modulo bölme yaklaşımı birden çok dilde kullanılabilir, oysa yukarıdaki cevap Python'a özgüdür.
.55
, soru başlığından dolayı beklemeyebileceğiniz nokta ( ) içeren bir dize döndürür !
str(5.55 - int(5.55))[1:]
soruda belirtilen .5499999999999998
yerine döndürür .55
.
5.55 % 1
Bunun kayan nokta yuvarlama problemlerinde size yardımcı olmayacağını unutmayın. Yani, şunları alabilirsiniz:
0.550000000001
Ya da beklediğiniz 0,55'in biraz dışında.
modf
, hassasiyeti de math.modf(5.55)
bozabilir : geri dönecektir (0.5499999999999998, 5.0).
x%1
neredeyse iki kat daha hızlıydı (zamanlamalar 980ns, 1.39us ve 1000000 çalıştırma üzerinden ortalama olarak 1.47us idi). Değerim her zaman olumluydu, bu yüzden endişelenmeme gerek kalmadı. x-int(x)
modf(x)[0]
x
Modf kullanın :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
beklenen cevap 0.53
Ne dersin:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
Veya numpy kullanarak:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
decimal
Standart kitaplıktaki modülü kullanarak orijinal hassasiyeti koruyabilir ve kayan nokta yuvarlama sorunlarını önleyebilirsiniz:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
As kindall notları yorumlarda, yerel dönüştürmek gerekecek float
ilk dizeleri s.
n = 5.55
, n bir float'tır ve Decimal(str(n)) % 1
kesirli kısmı elde etmek için yapmalısınız . (Bu, bir tamsayı varsa gerekli değildir, ancak zarar vermez.)
10.0/3 % 1
en azından benim sistemimde
Decimal.from_float(1.2)
(şimdi şu şekilde yazılabilir Decimal(1.2)
), bu cevabın kaçınmaya çalıştığı yuvarlama sorunlarınız olacaktır.
kabul edilen cevaba benzer şekilde, dizeleri kullanarak daha kolay yaklaşım
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
verir TypeError: argument of type 'float' is not iterable
. Peki ne yapardın number = 1e-5
?
float
; Python, başlangıçta hangi formatta ifade edildiğine dair herhangi bir bilgi tutmaz. number = 1e-5
Örneğim eşit derecede geçerlidir number = 0.00001
: str
sayının temsili bilimsel gösterimdedir. Sen uğraşmak isteyeceksiniz e+
yanı sıra e-
, bu arada.
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
Bazen sondaki sıfırlar önemlidir
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)
Taban kullanın ve sonucu orijinal sayıdan çıkarın:
>> 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
, neden sadece kullanmıyorsun math.modf()
?
math.floor(-1.1) == -2
ama int(-1.1) == -1
. Bu soru için kullanmak int
daha doğrudur.
Kayan sayılar ondalık (10 bazında) biçimde saklanmaz. Nedenini anlamak için bununla ilgili python belgelerini okuyun . Bu nedenle, bir kayan noktadan bir base10 temsilinin alınması tavsiye edilmez.
Artık sayısal verilerin ondalık biçimde depolanmasına izin veren araçlar var. Aşağıda Decimal
kitaplığı kullanan bir örnek yer almaktadır .
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Misal:
import math
x = 5.55
print((math.floor(x*100)%100))
Bu size ondalık noktadan sonra iki sayı verir, bu örnekten 55. Bir sayıya ihtiyacınız varsa, yukarıdaki hesaplamaları 10 azaltın veya ondalık sayıdan sonra istediğiniz sayıya bağlı olarak artırın.
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
Kesinlikle işe yaradı
Ne dersin:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
Çıktı:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Tur, ondalıklar dizisinin uzunluğuna ('0.234') gönderildiği için, '0'ı saymamak için eksi 2 ve istenen ondalık basamak sayısını bulabiliriz. Bu, çok fazla ondalık basamağınız yoksa ve b'yi hesaplarken yuvarlama hatası, yuvarlamanın ikinci parametresiyle çakışmadığı sürece çoğu kez çalışmalıdır.
Bunu denemek isteyebilirsiniz:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Geri dönecek 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
çıktı: 0,55
Diğer bir seçenek, re
modülü re.findall
veya ile kullanmak olabilir 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
İfadeyi basitleştirmek / değiştirmek / keşfetmek isterseniz, regex101.com'un sağ üst panelinde açıklanmıştır . İsterseniz, bu bağlantıdan bazı örnek girdilerle nasıl eşleşeceğini de izleyebilirsiniz .
Python çıkarma işleminde ek kayan sayılardan nasıl kurtulurum?
Gerçekten büyük kesirli parçalara sahip gerçekten büyük sayıların, kesri elde etmek için modulo 1 kullanırken sorunlara neden olabileceğini buldum.
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'>]
Bunun yerine integral parçayı aldım ve geri kalanını basitleştirmek için önce çıkardım.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Modf kullanan başka bir örnek
from math import modf
number = 1.0124584
# [0] decimal, [1] integer
result = modf(number)
print(result[0])
# output = 0124584
print(result[1])
# output = 1
Çözüm, modulo ve yuvarlama kullanıyor.
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)))
Çıktınız 0,55 olacaktır
Bunu kullanabilirsiniz:
number = 5.55
int(str(number).split('.')[1])