Bagaimana cara mendapatkan angka setelah koma desimal?
Misalnya, jika sudah 5.55
, bagaimana cara mendapatkannya .55
?
Bagaimana cara mendapatkan angka setelah koma desimal?
Misalnya, jika sudah 5.55
, bagaimana cara mendapatkannya .55
?
Jawaban:
Pendekatan yang mudah untuk Anda:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
, yang juga merupakan jawaban yang lebih berguna secara umum - seseorang dapat menggunakan pendekatan pembagian modulo dalam berbagai bahasa, sedangkan jawaban di atas khusus untuk Python.
.55
), yang mungkin tidak Anda harapkan karena judul pertanyaan!
str(5.55 - int(5.55))[1:]
mengembalikan .5499999999999998
alih-alih yang .55
disebutkan dalam pertanyaan.
5.55 % 1
Ingatlah bahwa ini tidak akan membantu Anda dengan masalah pembulatan floating point. Yaitu, Anda mungkin mendapatkan:
0.550000000001
Atau sebaliknya sedikit dari 0,55 yang Anda harapkan.
modf
, itu dapat mengacaukan presisi juga: math.modf(5.55)
akan kembali (0.5499999999999998, 5.0).
x%1
ini hampir dua kali lebih cepat dari x-int(x)
dan modf(x)[0]
metode (waktunya adalah 980ns, 1.39us, dan 1.47us rata-rata lebih dari 1000000 berjalan). Nilai saya x
selalu positif jadi saya tidak perlu khawatir tentang itu.
Gunakan modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
jawaban yang diharapkan adalah 0,53
Bagaimana dengan:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
Atau, menggunakan numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Dengan menggunakan decimal
modul dari pustaka standar, Anda dapat mempertahankan presisi asli dan menghindari masalah pembulatan floating point:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Sebagai catatan kindall di komentar, Anda harus mengonversi native ke string terlebih dahulu.float
n = 5.55
, n adalah pelampung, dan Anda harus melakukannya Decimal(str(n)) % 1
untuk mendapatkan bagian pecahan. (Ini tidak diperlukan jika Anda memiliki bilangan bulat, tetapi tidak ada salahnya.)
10.0/3 % 1
setidaknya di sistem saya
Decimal.from_float(1.2)
(yang sekarang dapat ditulis sebagai Decimal(1.2)
), Anda akan mengalami masalah pembulatan, yang coba dihindari oleh jawaban ini.
mirip dengan jawaban yang diterima, pendekatan yang lebih mudah menggunakan string akan menjadi
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
memberi TypeError: argument of type 'float' is not iterable
. Dan apa yang akan Anda lakukan jika number = 1e-5
?
float
; Python tidak menyimpan pengetahuan apa pun tentang format aslinya. number = 1e-5
Contoh saya berlaku sama baiknya untuk number = 0.00001
: str
representasi bilangan dalam notasi ilmiah. Anda pasti ingin berurusan dengan e+
sebaik-baiknya e-
.
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
Terkadang tertinggal nol penting
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)
Gunakan floor dan kurangi hasilnya dari bilangan asli:
>> 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
, mengapa tidak menggunakan saja math.modf()
?
math.floor(-1.1) == -2
tapi int(-1.1) == -1
. Padahal untuk pertanyaan ini menggunakan int
lebih tepat.
Angka float tidak disimpan dalam format desimal (base10). Bacalah dokumentasi python tentang ini untuk memuaskan diri Anda mengapa. Oleh karena itu, untuk mendapatkan representasi base10 dari float tidak disarankan.
Sekarang ada alat yang memungkinkan penyimpanan data numerik dalam format desimal. Di bawah ini adalah contoh menggunakan Decimal
perpustakaan.
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
Contoh:
import math
x = 5.55
print((math.floor(x*100)%100))
Ini akan memberi Anda dua angka setelah koma, 55 dari contoh itu. Jika Anda membutuhkan satu angka, kurangi dengan 10 kalkulasi di atas atau tambah tergantung berapa banyak angka yang Anda inginkan setelah desimal.
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
Ini pasti berhasil
Bagaimana dengan:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
Keluaran:
print(b)
0.23399999999999999
round(b, length-2)
0.234
Karena putaran dikirim ke panjang string desimal ('0,234'), kita hanya dapat minus 2 untuk tidak menghitung '0', dan mencari tahu jumlah titik desimal yang diinginkan. Ini seharusnya bekerja paling sering, kecuali Anda memiliki banyak tempat desimal dan kesalahan pembulatan saat menghitung b mengganggu parameter putaran kedua.
Anda mungkin ingin mencoba ini:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
Ini akan kembali 0.55
.
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
keluaran: 0,55
Pilihan lainnya adalah menggunakan re
modul dengan re.findall
atau 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
Jika Anda ingin menyederhanakan / memodifikasi / menjelajahi ekspresi, itu telah dijelaskan di panel kanan atas regex101.com . Jika mau, Anda juga dapat melihat di tautan ini , bagaimana kecocokannya dengan beberapa masukan sampel.
Bagaimana cara menghilangkan bilangan mengambang tambahan dalam pengurangan python?
Saya telah menemukan bahwa angka yang sangat besar dengan bagian pecahan yang sangat besar dapat menyebabkan masalah saat menggunakan modulo 1 untuk mendapatkan pecahan.
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'>]
Saya malah mengambil bagian integral dan menguranginya terlebih dahulu untuk membantu menyederhanakan sisanya.
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
Contoh lain menggunakan 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
Solusinya menggunakan modulo dan pembulatan.
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)))
Output Anda akan menjadi 0,55
Anda dapat menggunakan ini:
number = 5.55
int(str(number).split('.')[1])