Apakah ada fungsi bawaan yang dapat membulatkan seperti berikut?
10 -> 10
12 -> 10
13 -> 15
14 -> 15
16 -> 15
18 -> 20
Saya tidak tahu fungsi standar dengan Python, tetapi ini berfungsi untuk saya:
def myround(x, base=5):
return int(base * round(float(x)/base))
def myround(x, base=5):
return base * round(x/base)
Sangat mudah untuk melihat mengapa hal di atas berhasil. Anda ingin memastikan bahwa angka Anda dibagi 5 adalah bilangan bulat, dibulatkan dengan benar. Jadi, pertama-tama kita melakukan hal itu (di round(float(x)/5)
mana float
hanya diperlukan di Python2), dan kemudian karena kita dibagi 5, kita kalikan dengan 5 juga. Konversi terakhir ke int
adalah karena round()
mengembalikan nilai floating-point dalam Python 2.
Saya membuat fungsi lebih umum dengan memberinya base
parameter, default ke 5.
x // base * base
floor()
danceil()
bukannya casting:base * floor(x/base)
math.floor
danmath.ceil
jangan izinkan digunakan dengan basis kustom, sehingga preferensi tidak relevan.Untuk pembulatan ke nilai non-integer, seperti 0,05:
Saya menemukan ini berguna karena saya hanya bisa melakukan pencarian dan mengganti kode saya untuk mengubah "round (" menjadi "myround (", tanpa harus mengubah nilai parameter.
sumber
def my_round(x, prec=2, base=0.05): return (base * (np.array(x) / base).round()).round(prec)
yang menerima array numpy juga.Ini hanya masalah penskalaan
sumber
Menghapus 'sisanya' akan bekerja:
Jika nilainya diberikan integer:
Sebagai fungsi:
sumber
sumber
round (x [, n]): nilai dibulatkan ke kelipatan terdekat dari 10 ke minus daya n. Jadi jika n negatif ...
Karena 10 = 5 * 2, Anda dapat menggunakan pembagian integer dan perkalian dengan 2, daripada pembagian float dan perkalian dengan 5.0. Bukan berarti itu penting, kecuali jika Anda suka sedikit bergeser
sumber
Maaf, saya ingin mengomentari jawaban Alok Singhai, tetapi itu tidak akan membiarkan saya karena kurangnya reputasi = /
Bagaimanapun, kita dapat menggeneralisasi satu langkah lagi dan pergi:
Ini memungkinkan kita untuk menggunakan basis non-integer, seperti
.25
atau basis fraksional lainnya.sumber
Versi modifikasi divround :-)
sumber
Menggunakan:
Itu tidak menggunakan perkalian dan tidak akan mengkonversi dari / ke mengapung.
Pembulatan ke kelipatan 10 terdekat:
Seperti yang Anda lihat, ini berfungsi baik untuk angka negatif maupun positif. Dasi (mis. -15 dan 15) akan selalu dibulatkan ke atas.
Contoh serupa yang membulatkan ke kelipatan 5 terdekat, menunjukkan bahwa ia juga berperilaku seperti yang diharapkan untuk "pangkalan" yang berbeda:
sumber
Jika seseorang membutuhkan "pembulatan keuangan" (0,5 putaran selalu naik):
Sesuai dokumentasi, opsi pembulatan lainnya adalah:
Secara default Python menggunakan ROUND_HALF_EVEN karena memiliki beberapa keunggulan statistik (hasil yang dibulatkan tidak bias).
sumber
Untuk bilangan bulat dan dengan Python 3:
Memproduksi:
sumber
Bagaimana dengan ini:
sumber
Kelipatan 5 berikutnya
Pertimbangkan 51 yang perlu dikonversi menjadi 55:
sumber
Ini kode C saya. Jika saya memahaminya dengan benar, itu seharusnya menjadi sesuatu seperti ini;
dan ini juga membulatkan ke kelipatan 5 terdekat bukan hanya mengumpulkan;
sumber
Cara lain untuk melakukan ini (tanpa operator multiplikasi atau divisi eksplisit):
sumber
Anda dapat “menipu”
int()
untuk membulatkan alih-alih membulatkannya dengan menambahkan0.5
nomor yang Anda lewatiint()
.sumber