Seperti judulnya, saya ingin mengambil angka floating point dan membulatkannya ke bilangan bulat terdekat. Namun, jika tidak keseluruhan, saya SELALU ingin membulatkan variabel, terlepas dari seberapa dekat dengan bilangan bulat berikutnya. Apakah ada cara untuk melakukan ini?
python
floating-point
integer
rounding
Anthony Perez
sumber
sumber
Jawaban:
Sederhana
akan bekerja dengan baik.
sumber
int(-23.3) == 23
Salah satu dari ini harus bekerja:
sumber
math.trunc
adalah integer, sedangkan output darimath.floor
adalah float.type(math.floor(1.51)) -> int
dantype(math.trunc(1.51)) -> int
perpython 3.6.0
The
//
Operator mengembalikan lantai divisi. Karena membagi dengan 1 tidak mengubah angka Anda, ini sama dengan floor tetapi tidak perlu impor. Catatan:sumber
int(-1.1) == -1
sementara-1.1//1 == -2.0
bagaimanapundecimal.Decimal('-1.1')//1 == decimal.Decimal('-1')
(seperti yang didokumentasikan, klaim 2 tidak benar untukdecimal
), jadi mengandalkan bagaimana//
berperilaku tidak sepenuhnya stabil, bahkan hari ini.Untuk mendapatkan hasil floating point cukup gunakan:
Ini berfungsi untuk angka negatif juga.
sumber
Saya pikir Anda membutuhkan fungsi lantai:
math.floor (x)
sumber
banyak orang mengatakan untuk menggunakan
int(x)
, dan ini berfungsi dengan baik untuk kebanyakan kasus, tetapi ada sedikit masalah. Jika hasil OP adalah:itu akan membulatkan ke
setelah tanggal 16 9 itu akan bulat. Ini bukan masalah besar jika Anda yakin tidak akan pernah menemukan hal seperti itu. Tapi itu sesuatu yang perlu diingat.
sumber
1.9999999999999999
sebenarnya sama dengan2.0
dalam representasi float64 internal. I. e. itu sudah dibulatkan segera setelah diurai menjadi float, karena float 64 bit tidak dapat mewakili banyak digit signifikan itu. Anda dapat memverifikasi itu dengan mengevaluasi1.9999999999999999 == 2.0
. Dan jika Anda menduga bahwa operasi sama dengan melakukan pembulatan pada float, Anda dapat membandingkan representasi biner denganstruct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
, yang juga sama.int()
. Nilainya sudah 2.0 dan dengan senang hati akan mengubahnya menjadi 2.int()
, itu hanya ada hubungannya dengan penggunaan yang tidak tepatfloat
, seperti1.9999999999999999
yang dibulatkan2.0
pada waktu kompilasi (sementaraint()
dipanggil pada waktu eksekusi). Jika Anda menggunakan tipe data yang tepat untuk variabel, semuanya bekerja seperti yang diharapkan:int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
memberikan1
Jika Anda tidak ingin mengimpor matematika, Anda dapat menggunakan:
int(round(x))
Ini adalah bagian dari dokumentasi:
sumber
round
sudah dibahas dan ditolak sebagai jawaban ketika pertanyaan ini diajukan setahun yang lalu. OP inginmath.floor
.Jika Anda bekerja dengan numpy, Anda dapat menggunakan solusi berikut yang juga berfungsi dengan bilangan negatif (ini juga bekerja pada array)
Saya pikir itu juga akan berfungsi jika Anda hanya menggunakan
math
modul, bukannumpy
modul.sumber
Tidak tahu apakah Anda memecahkan ini, tetapi saya baru saja menemukan pertanyaan ini. Jika Anda ingin menghilangkan titik desimal, Anda dapat menggunakan int (x) dan itu akan menghilangkan semua angka desimal. Tidak perlu menggunakan round (x).
sumber
Buat saja putaran (x-0,5) ini akan selalu mengembalikan nilai Integer berikutnya yang dibulatkan ke bawah dari Float Anda. Anda juga dapat dengan mudah membulatkan dengan do round (x + 0,5)
sumber
Ini mungkin sangat sederhana, tetapi tidak bisakah Anda membulatkannya lalu minus 1? Sebagai contoh:
sumber
integer
.Saya menggunakan kode ini di mana Anda mengurangi 0,5 dari angka dan ketika Anda membulatkannya, itu adalah angka asli yang dibulatkan ke bawah.
sumber