Membulatkan Angka Mengambang ke Bilangan Bulat Terdekat?

128

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?

Anthony Perez
sumber
2
Kesulitan yang mungkin terjadi adalah format IEEE floating point dapat merepresentasikan angka yang sangat besar sehingga grandularity lebih besar dari 1. Sehingga, meskipun Anda dapat membulatkan x ke bawah pembulatan x + 1 ke bawah tidak akan memberikan hasil yang diharapkan.
dmckee --- mantan moderator anak kucing
Silakan posting beberapa contoh.
Ashwini Chaudhary

Jawaban:

179

Sederhana

print int(x)

akan bekerja dengan baik.

Makaveli
sumber
7
int (0.6) = 0 daripada 1
Helin Wang
39
@HelinWang Itulah yang diminta OP.
Petr Peller
5
Ini sepertinya pendekatan yang paling Pythonic.
Gyan Veda
23
Ini bekerja dengan baik untuk angka positif, tetapi angka negatif akan dibulatkan:int(-23.3) == 23
Alex Riley
2
dan tidak berfungsi untuk angka di luar rentang integer seperti 600851475143, ini pada dasarnya akan menandai kesalahan memori.
Muyide Ibukun
77

Salah satu dari ini harus bekerja:

import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2
U2EF1
sumber
14
Output dari math.truncadalah integer, sedangkan output dari math.flooradalah float.
evedovelli
6
@evedovelli: Tidak lagi. type(math.floor(1.51)) -> intdan type(math.trunc(1.51)) -> intperpython 3.6.0
SKPS
4
Opsi ini lebih eksplisit daripada "int (x)" dan karenanya lebih Pythonic.
Tristan
44
x//1

The //Operator mengembalikan lantai divisi. Karena membagi dengan 1 tidak mengubah angka Anda, ini sama dengan floor tetapi tidak perlu impor. Catatan:

  1. Ini mengembalikan float
  2. Putaran ini menuju -∞
Huy D
sumber
Tambahan yang bagus. int(-1.1) == -1sementara -1.1//1 == -2.0bagaimanapun decimal.Decimal('-1.1')//1 == decimal.Decimal('-1')(seperti yang didokumentasikan, klaim 2 tidak benar untuk decimal), jadi mengandalkan bagaimana //berperilaku tidak sepenuhnya stabil, bahkan hari ini.
Tino
28

Untuk mendapatkan hasil floating point cukup gunakan:

round(x-0.5)

Ini berfungsi untuk angka negatif juga.

DmitryG
sumber
6
sangat canggih yaitu
Alon
27

Saya pikir Anda membutuhkan fungsi lantai:

math.floor (x)

voidMainReturn
sumber
5
di python 2 ini mengembalikan float sedangkan di python 3 itu mengembalikan int
voidMainReturn
1
int (math.floor (x)) atau float (math.floor (x))
Jeff
9

banyak orang mengatakan untuk menggunakan int(x), dan ini berfungsi dengan baik untuk kebanyakan kasus, tetapi ada sedikit masalah. Jika hasil OP adalah:

x = 1.9999999999999999

itu akan membulatkan ke

x = 2

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.

lokilindo
sumber
17
Itu karena 1.9999999999999999sebenarnya sama dengan 2.0dalam 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 mengevaluasi 1.9999999999999999 == 2.0. Dan jika Anda menduga bahwa operasi sama dengan melakukan pembulatan pada float, Anda dapat membandingkan representasi biner dengan struct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0), yang juga sama.
blubberdiblub
4
Dan jika itu benar-benar maksud Anda, maka saya tidak melihat apa yang salah int(). Nilainya sudah 2.0 dan dengan senang hati akan mengubahnya menjadi 2.
blubberdiblub
1
Jika OP (atau siapa pun yang membaca ini di masa mendatang) bermaksud menggunakan bilangan bulat terdekat (dan bukan nilai pembulatan) untuk alasan apa pun, maka itu akan menjadi sesuatu yang perlu diingat.
lokilindo
3
@lokilindo Tapi ini tidak ada hubungannya dengan int(), itu hanya ada hubungannya dengan penggunaan yang tidak tepatfloat , seperti 1.9999999999999999yang dibulatkan 2.0 pada waktu kompilasi (sementara int()dipanggil pada waktu eksekusi). Jika Anda menggunakan tipe data yang tepat untuk variabel, semuanya bekerja seperti yang diharapkan: int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))memberikan1
Tino
6

Jika Anda tidak ingin mengimpor matematika, Anda dapat menggunakan:

int(round(x))

Ini adalah bagian dari dokumentasi:

>>> help(round)
Help on built-in function round in module __builtin__:

round(...)
    round(number[, ndigits]) -> floating point number

    Round a number to a given precision in decimal digits (default 0 digits).
    This always returns a floating point number.  Precision may be negative.
Tyler
sumber
Terima kasih atas jawaban anda. Lain kali Anda akan mendapatkan penerimaan yang lebih baik jika Anda menulis kode yang benar (tutup kurung), dan memberikan beberapa dokumentasi.
Geoff
2
roundsudah dibahas dan ditolak sebagai jawaban ketika pertanyaan ini diajukan setahun yang lalu. OP ingin math.floor.
Adam Smith
3

Jika Anda bekerja dengan numpy, Anda dapat menggunakan solusi berikut yang juga berfungsi dengan bilangan negatif (ini juga bekerja pada array)

import numpy as np
def round_down(num):
    if num < 0:
        return -np.ceil(abs(num))
    else:
        return np.int32(num)
round_down = np.vectorize(round_down)

round_down([-1.1, -1.5, -1.6, 0, 1.1, 1.5, 1.6])
> array([-2., -2., -2.,  0.,  1.,  1.,  1.])

Saya pikir itu juga akan berfungsi jika Anda hanya menggunakan mathmodul, bukan numpymodul.

Tuan Poin
sumber
1

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

Gaahbon
sumber
1

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)

Dominic Nagel
sumber
-1

Ini mungkin sangat sederhana, tetapi tidak bisakah Anda membulatkannya lalu minus 1? Sebagai contoh:

number=1.5
round(number)-1
> 1

sumber
4
Ini memberikan jawaban yang salah untuk seluruh bilangan bulat. Misalnya, 2.0 dibulatkan adalah 2, dan jika Anda mengurangi 1 Anda mendapatkan hasil yang salah 1.
Pascal Cuoq
@PascalCuoq Saya tidak mengerti masalah Anda. Apakah Anda menginginkan 1.0 sebagai hasilnya? Karena OP jelas-jelas ingin membulatkan maka angka ke angka terdekat integer.
bad_keypoints
1
@bad_keypoints Saya tidak berpikir bahwa OP ingin membulatkan 2.0 ke 1.
Pascal Cuoq
@PascalCuoq maaf, saya baru saja melihat kembali jawaban di utas komentar tentang kami.
bad_keypoints
-3

Saya menggunakan kode ini di mana Anda mengurangi 0,5 dari angka dan ketika Anda membulatkannya, itu adalah angka asli yang dibulatkan ke bawah.

bulat (a-0,5)

pengguna10555509
sumber
1
Apa perbedaan dari jawaban yang ada ini ?
xskxzr