Ondalık noktadan sonra sayılar nasıl elde edilir?


Yanıtlar:


28

Sizin için kolay bir yaklaşım:

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

31
Okuyucu için Egzersiz: o 10'a eşit veya büyük sayılar için çalışmasını sağlamak
intuited

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

28
Olumsuz oy verin çünkü bu gereksiz yere karmaşık bir yaklaşımdır. Aradığım cevap bir sonraki cevaptı ve 5.55 % 1bu 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.
Güveç

3
NOT: Bu çözüm .55, soru başlığından dolayı beklemeyebileceğiniz nokta ( ) içeren bir dize döndürür !
T. Christiansen

9
str(5.55 - int(5.55))[1:]soruda belirtilen .5499999999999998yerine döndürür .55.
Cristian Ciupitu

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


7
Gelince modf, hassasiyeti de math.modf(5.55)bozabilir : geri dönecektir (0.5499999999999998, 5.0).
bereal

1
hangisinin daha hızlı işlem olacağını, yukarıda açıklanan bu yöntemi veya: float b = a - int (a) olduğunu bilen var mı? daha sonra şüpheleniyorum, ancak onay olup olmadığını görmek istedim
hokkuk

5
Raspberry Pi'de bu yöntem ve yöntemlerinden x%1neredeyse 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
coderforlife

Kesinlikle modül çalışması daha hızlıdır. Herhangi bir isim araması yapmak zorunda değildir. Oysa int işlevini çağırmak global değişkenler üzerinde bir arama yapar.
Enrico Borba

sadece frac () sahibi olmak değil
mckenzm

155

Modf kullanın :

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

2
İyi çözüm, ancak math.modf(2.53) = (0.5299999999999998, 2.0)beklenen cevap 0.53
Lord Loh.

4
@LordLoh. bunun nedeni kayan nokta yuvarlamasıdır ve herhangi bir yöntemle gerçekleşecektir.
Rena

@LordLoh. 0.53 elde etmek için yuvarlak (0.5299999999999998, 2) kullanmayı deneyin. Başka bir yol da ondalık paketten Ondalık'ı kullanmaktır. docs.python.org/2/library/decimal.html
SirJ

57

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)

33

decimalStandart 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 floatilk dizeleri s.


Orijinal soru sorucunun yararı için: kayan sayılar, Ondalık sayıya dönüştürülmeden önce dizelere dönüştürülmelidir. Yani eğer varsa n = 5.55, n bir float'tır ve Decimal(str(n)) % 1kesirli kısmı elde etmek için yapmalısınız . (Bu, bir tamsayı varsa gerekli değildir, ancak zarar vermez.)
kindall

2
@intuited: Ondalık olması gerekmez, float için de çalışır: 10.0/3 % 1en azından benim sistemimde
aherok

2
Bir dizge kullanmak yerine from_float kullanabilirsiniz. d = Decimal.from_float (1.2)
Matthew Purdon

@intuited Ondalık kısmı tam sayı olarak nasıl elde edebilirim? To_integer () yöntemlerini denedim, ancak tür hala Decimal.
D1X

1
@MatthewPurdon - Kullanırsanız 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.
John Y


5

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 numberverir TypeError: argument of type 'float' is not iterable. Peki ne yapardın number = 1e-5?
Mark Dickinson

@mark the question is Bir ondalık noktadan sonraki sayıları nasıl alabilirim? bu nedenle kullanıcı ondalık gösterimde (bilimsel gösterimde değil) kayan sayı bekliyor, bilimsel gösterim için de bir blok ekledim
yosemite_k

Bir sayı bir sayıdır; yalnızca bilimsel gösterimde olabilecek bir sayının temsilidir . Yani "ondalık gösterimde float" burada pek bir anlam ifade etmiyor; Python bunu gördüğünde, sadece bir 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: strsayının temsili bilimsel gösterimdedir. Sen uğraşmak isteyeceksiniz e+yanı sıra e-, bu arada.
Mark Dickinson

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

>>> frac 0.5499999999999998
macm

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

2
Bu, bahçe çeşitliliği sayıları için uygundur, ancak bilimsel gösterim gerektirecek kadar büyük (veya küçük) sayılar için o kadar iyi çalışmaz.
13'te nazikçe

2

Bu denediğim bir çözüm:

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

2

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)

0.000005 için bu ne yapar?
Aditya Patnaik

2

Sadece basit operatör bölme '/' ve kat bölme '//' kullanarak herhangi bir şamandıranın kesir kısmını kolayca elde edebilirsiniz.

number = 5.55

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

print(result)

1

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

5
Eğer yapacaksan import math, neden sadece kullanmıyorsun math.modf()?
ire_and_curses

@ire_and_curses: Soruna alternatif bir çözüm sunuyorum.

1
floor bir int'e çevrim yapmakla aynı şeyi yapar, bu yüzden math.floor (t) yerine int (t)
QuantumKarl

@QuantumKarl Hayır, onlar farklı. math.floor(-1.1) == -2ama int(-1.1) == -1. Bu soru için kullanmak intdaha doğrudur.
Lambda Fairy

1

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 Decimalkitaplığı 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

1

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.


Bu güzel, çünkü kesirli olmayan bir değer
döndürüyor

Maalesef çoğu zaman işe yaramıyor. @Meow
Marquis of Lorne


0

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.


Herhangi bir açıklama var mı?

0

Bunu denemek isteyebilirsiniz:

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

Geri dönecek 0.55.


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

çıktı: 0,55


0

Python 3'te ondalık noktadan sonraki sayıları elde etmek için sıklıkla ne yaptığımı görün:

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

0

Pandalar kullanıyorsanız:

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

0

Diğer bir seçenek, remodülü re.findallveya 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))

Çıktı

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 .


Kaynak

Python çıkarma işleminde ek kayan sayılardan nasıl kurtulurum?


0

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

0

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

0

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



-2

Başka bir çılgın çözüm (bir dizeye dönüştürmeden):

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.