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?


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.


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

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 -∞

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.


6
sangat canggih yaitu
Alon


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.


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.

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.


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


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)


-1

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

number=1.5
round(number)-1
> 1

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.