Modul matematika Python berisi fungsi-fungsi praktis seperti floor
& ceil
. Fungsi-fungsi ini mengambil nomor floating point dan mengembalikan bilangan bulat terdekat di bawah atau di atasnya. Namun fungsi-fungsi ini mengembalikan jawabannya sebagai angka titik mengambang. Sebagai contoh:
import math
f=math.floor(2.3)
Sekarang f
kembali:
2.0
Apa cara teraman untuk mendapatkan bilangan bulat dari float ini, tanpa menjalankan risiko kesalahan pembulatan (misalnya jika float setara dengan 1,99999) atau mungkin saya harus menggunakan fungsi lain sama sekali?
python
math
integer
python-2.x
Boas
sumber
sumber
math.floor
mengembalikan float di v2.6 , tetapi mengembalikan bilangan bulat di v3 . Pada titik ini (hampir enam tahun setelah OP), masalah ini mungkin jarang muncul.Jawaban:
Semua bilangan bulat yang dapat diwakili oleh angka floating point memiliki representasi yang tepat. Jadi Anda bisa menggunakan dengan aman
int
hasilnya dengan aman. Representasi eksak terjadi hanya jika Anda mencoba untuk mewakili bilangan rasional dengan penyebut yang bukan kekuatan dua.Bahwa ini bekerja sama sekali tidak sepele! Ini adalah properti dari representasi floating point IEEE yang int∘floor = ⌊⋅⌋ jika besarnya angka yang dimaksud cukup kecil, tetapi representasi yang berbeda dimungkinkan di mana int (lantai (2.3)) mungkin 1.
Mengutip dari Wikipedia ,
sumber
Gunakan
int(your non integer number)
akan paku itu.sumber
floor
putaran ke bawah sedangkanint
putaran ke arah 0.int(-2.3)
dalam distribusi Python Canopy 2.7.6 dan mendapatkan-2
seperti yang diharapkan. Angka integer bisa negatif, dengan cara yang sama dalam definisi Matematika formal.int(-2.3)
memberi-2
seperti yang Anda katakan, karena itu bulat ke atas0
, yaitu di dalam kasus ini. Sebaliknya, pertanyaan awal yang digunakanmath.floor
, yang selalu dibulatkan:math.floor(-2.3)
memberi-3.0
.math.floor
, dan jawaban ini menunjukkan cara mengubah float menjadi integer. Ambil float darimath.floor
dan pipa melaluiint
, masalah terpecahkan:int(math.floor(2.3))
Anda bisa menggunakan fungsi putaran. Jika Anda tidak menggunakan parameter kedua (# digit signifikan) maka saya pikir Anda akan mendapatkan perilaku yang Anda inginkan.
Output IDLE.
sumber
round
mengembalikan nomor float juga, setidaknya dalam Python 2.6.round
danfloor
mengembalikan integer dengan Python 3.x. Jadi saya kira pertanyaannya menyangkut Python 2.x.int(round(2.65))
?round(6.5)
memberi 6? Tampaknya agakceil()
mengambang ketika ada 5 langsung (atau lebih besar hingga 9) setelah desimal dalam semua kasus lainnya. Mengapa ini tidak berhasil dalam kasus ini? atau kasus lain ketika angka berakhir dengan angka enam dan ada angka 5 tepat setelah desimal ...Menggabungkan dua hasil sebelumnya, kami memiliki:
Ini mengkonversi float ke integer yang cukup dapat diandalkan.
sumber
float
mewakili angka yang lebih besar dari apa yangint
bisa dimiliki orang normal . Dalam Python 2, apakah adafloat
nilai yang hanya bisa Anda wakili menggunakanlong
(setelah pembulatan)?int()
fungsi ini menghasilkan suatuint
ataulong
berdasarkan apa yang dibutuhkan ...Posting ini menjelaskan mengapa ia bekerja dalam kisaran itu .
Dalam double, Anda dapat mewakili bilangan bulat 32bit tanpa masalah. Ada tidak bisa menjadi masalah pembulatan. Lebih tepatnya, ganda dapat mewakili semua bilangan bulat di antara dan termasuk 2 53 dan -2 53 .
Penjelasan singkat : Double dapat menyimpan hingga 53 digit biner. Ketika Anda membutuhkan lebih banyak, nomor tersebut diisi dengan angka nol di sebelah kanan.
Oleh karena itu, 53 yang merupakan jumlah terbesar yang dapat disimpan tanpa bantalan. Secara alami, semua angka (bilangan bulat) yang membutuhkan lebih sedikit digit dapat disimpan secara akurat.
Menambahkan satu ke 111 (dihilangkan) 111 (53 yang) menghasilkan 100 ... 000, (53 nol). Seperti yang kita tahu, kita dapat menyimpan 53 digit, yang membuat padding nol paling kanan.
Di sinilah 2 53 berasal.
Lebih detail: Kita perlu mempertimbangkan cara kerja floating point IEEE-754.
Jumlahnya kemudian dihitung sebagai berikut (tidak termasuk kasus khusus yang tidak relevan di sini):
di mana bias = 2 eksponen - 1 - 1 , yaitu 1023 dan 127 untuk presisi ganda / tunggal.
Mengetahui bahwa mengalikan dengan 2 X hanya menggeser semua bit X tempat ke kiri, mudah untuk melihat bahwa setiap bilangan bulat harus memiliki semua bit dalam mantissa yang berakhir tepat dari titik desimal ke nol.
Bilangan bulat apa pun kecuali nol memiliki bentuk berikut dalam biner:
Karena kami mengecualikan nol, akan selalu ada MSB yang satu - yang mengapa tidak disimpan. Untuk menyimpan bilangan bulat, kita harus membawanya ke dalam bentuk yang disebutkan di atas: -1 tanda × 1.mantissa × 2 eksponen - bias .
Itu mengatakan hal yang sama seperti menggeser bit ke titik desimal sampai hanya ada MSB di sebelah kiri MSB. Semua bit tepat dari titik desimal kemudian disimpan dalam mantissa.
Dari sini, kita dapat melihat bahwa kita dapat menyimpan paling banyak 52 digit biner selain dari MSB.
Oleh karena itu jumlah tertinggi di mana semua bit disimpan secara eksplisit adalah
Untuk ini, kita perlu mengatur eksponen, sehingga titik desimal akan bergeser 52 tempat. Jika kita ingin meningkatkan eksponen dengan satu, kita tidak dapat mengetahui angka kanan ke kiri setelah titik desimal.
Dengan konvensi, ini adalah 0. Menetapkan seluruh mantissa ke nol, kami menerima nomor berikut:
Itu 1 diikuti oleh 53 nol, 52 disimpan dan 1 ditambahkan karena eksponen.
Ini mewakili 2 53 , yang menandai batas (baik negatif dan positif) di mana kita dapat secara akurat mewakili semua bilangan bulat. Jika kita ingin menambahkan satu ke 2 53 , kita harus menetapkan nol implisit (dilambangkan oleh
x
) menjadi satu, tetapi itu tidak mungkin.sumber
math.floor
akan selalu mengembalikan angka integer dan karenanyaint(math.floor(some_float))
tidak akan pernah memperkenalkan kesalahan pembulatan.Kesalahan pembulatan mungkin sudah diperkenalkan
math.floor(some_large_float)
, meskipun, atau bahkan ketika menyimpan sejumlah besar dalam pelampung di tempat pertama. (Sejumlah besar mungkin kehilangan presisi saat disimpan dalam mengapung.)sumber
int
danfloor
mengembalikan nilai yang berbeda untuk angka negatif, tentu saja.Jika Anda perlu mengkonversi string float ke int, Anda dapat menggunakan metode ini.
Contoh:
'38.0'
untuk38
Untuk mengonversikannya menjadi int, Anda dapat mengubahnya sebagai float lalu int. Ini juga akan berfungsi untuk string float atau string integer.
Catatan : Ini akan menghilangkan nomor apa pun setelah desimal.
sumber
Contoh kode lain untuk mengonversi real / float ke integer menggunakan variabel. "vel" adalah bilangan real / float dan dikonversi ke INTEGER tertinggi berikutnya, "newvel".
sumber
Karena Anda meminta cara 'paling aman', saya akan memberikan jawaban lain selain jawaban teratas.
Cara mudah untuk memastikan Anda tidak kehilangan presisi adalah memeriksa apakah nilainya akan sama setelah Anda mengubahnya.
Jika float adalah 1.0 misalnya, 1.0 sama dengan 1. Jadi konversi ke int akan dieksekusi. Dan jika float adalah 1.1, int (1.1) sama dengan 1, dan 1.1! = 1. Jadi nilainya akan tetap float dan Anda tidak akan kehilangan presisi.
sumber
df ['Column_Name'] = df ['Column_Name']. astype (int)
sumber