Saya baru saja membaca kembali What's New In Python 3.0 dan menyatakan:
Putaran () fungsi strategi pembulatan dan tipe pengembalian telah berubah. Kasus setengah jalan yang tepat sekarang dibulatkan ke hasil genap terdekat bukannya menjauh dari nol. (Misalnya, babak (2.5) sekarang mengembalikan 2 daripada 3.)
dan dokumentasi untuk putaran :
Untuk jenis bawaan yang mendukung putaran (), nilai dibulatkan ke kelipatan terdekat dari 10 dengan daya minus n; jika dua kelipatan sama-sama dekat, pembulatan dilakukan menuju pilihan genap
Jadi, di bawah v2.7.3 :
In [85]: round(2.5)
Out[85]: 3.0
In [86]: round(3.5)
Out[86]: 4.0
seperti yang saya harapkan. Namun, sekarang di bawah v3.2.3 :
In [32]: round(2.5)
Out[32]: 2
In [33]: round(3.5)
Out[33]: 4
Ini tampaknya kontra-intuitif dan bertentangan dengan apa yang saya pahami tentang pembulatan (dan pasti akan membuat orang tersandung). Bahasa Inggris bukan bahasa ibu saya tetapi sampai saya membaca ini saya pikir saya tahu apa arti pembulatan: - / Saya yakin pada saat v3 diperkenalkan pasti ada beberapa diskusi tentang ini, tetapi saya tidak dapat menemukan alasan yang baik dalam pencarian saya.
- Adakah yang tahu mengapa ini diubah?
- Apakah ada bahasa pemrograman utama lainnya (misalnya, C, C ++, Java, Perl, ..) yang melakukan pembulatan semacam ini (bagi saya tidak konsisten)?
Apa yang kulewatkan di sini?
UPDATE: @ Li-aungYip berkomentar tentang "Pembulatan Banker" memberi saya istilah pencarian / kata kunci yang tepat untuk mencari dan saya menemukan pertanyaan SO ini: Mengapa. NET menggunakan pembulatan bankir sebagai default? , jadi saya akan membacanya dengan cermat.
sumber
Jawaban:
Cara Python 3.0 dianggap sebagai metode pembulatan standar hari ini, meskipun beberapa implementasi bahasa belum di bus.
Teknik sederhana "selalu membulatkan 0,5" menghasilkan sedikit bias terhadap angka yang lebih tinggi. Dengan jumlah perhitungan yang besar, ini bisa menjadi signifikan. Pendekatan Python 3.0 menghilangkan masalah ini.
Ada lebih dari satu metode pembulatan yang umum digunakan. IEEE 754, standar internasional untuk matematika floating-point, mendefinisikan lima metode pembulatan yang berbeda (yang digunakan oleh Python 3.0 adalah default). Dan ada yang lainnya.
Perilaku ini tidak diketahui secara luas sebagaimana mestinya. AppleScript adalah, jika saya ingat dengan benar, pengguna awal metode pembulatan ini. The
round
perintah dalam AppleScript sebenarnya memang menawarkan beberapa pilihan, tapi round-menuju-bahkan default seperti di IEEE 754. Rupanya insinyur yang menerapkanround
perintah begitu bosan dengan semua permintaan untuk "membuatnya bekerja seperti yang saya pelajari di sekolah "yang dia implementasikan hanya itu:round 2.5 rounding as taught in school
adalah perintah AppleScript yang valid. :-)sumber
3
untuk2.5.round
Anda bisa mengontrol pembulatan yang Anda dapatkan di Py3000 menggunakan modul Desimal :
sumber
ROUND_HALF_UP
sama dengan perilaku lama Python 2.X.setcontext()
fungsinya.quantize(decimal.Decimal('1')
kequantize(decimal.Decimal('0.00')
jika Anda ingin putaran ke 100 terdekat seperti untuk uang.round(number, ndigits)
selamandigits
positif, tapi mengganggu Anda tidak dapat menggunakannya untuk mengganti sesuatu sepertiround(5, -1)
.Tambahkan saja catatan penting dari dokumentasi di sini:
https://docs.python.org/dev/library/functions.html#round
Jadi jangan heran untuk mendapatkan hasil berikut di Python 3.2:
sumber
2.675
tepat: yang paling dekat dengan komputer adalah2.67499999999999982236431605997495353221893310546875
. Itu cukup dekat, tetapi tidak persis sama dengan2.675
: itu sedikit lebih dekat2.67
daripada ke2.68
. Jadiround
fungsi melakukan hal yang benar, dan membulatkannya ke nilai 2-digit-setelah-titik yang lebih dekat, yaitu2.67
. Ini tidak ada hubungannya dengan Python, dan semuanya ada hubungannya dengan floating-point biner.Saya baru-baru punya masalah dengan ini juga. Oleh karena itu, saya telah mengembangkan modul python 3 yang memiliki 2 fungsi trueround () dan trueround_precision () yang membahas hal ini dan memberikan perilaku pembulatan yang sama dengan yang digunakan dari sekolah dasar (bukan pembulatan bankir). Inilah modulnya. Cukup simpan kode dan salin atau impor. Catatan: modul trueround_precision dapat mengubah perilaku pembulatan tergantung pada kebutuhan sesuai dengan ROUND_CEILING, ROUND_DOWN, ROUND_FLOOR, ROUND_HALF_DOWN, ROUND_HALF_EVEN, ROUND_HALF_UP, ROUND_UP, dan modul ROUND_05UP untuk informasi lebih lanjut tentang modul (lihat modul di modul desimal). Untuk fungsi-fungsi di bawah ini, lihat dokumen atau gunakan bantuan (trueround) dan bantuan (trueround_precision) jika disalin ke penerjemah untuk dokumentasi lebih lanjut.
Semoga ini membantu,
Narnie
sumber
Python 3.x rounds .5 nilai ke tetangga yang genap
namun, seseorang dapat mengubah pembulatan desimal "kembali" untuk selalu membulatkan 0,5 ke atas, jika perlu:
sumber
Perilaku pembulatan Python 2 dalam python 3.
Menambahkan 1 di tempat desimal ke-15. Akurasi hingga 15 digit.
sumber
2.675
adalah2.67499999999999982236431605997495353221893310546875
. Menambahkan 1e-15 akan memberi tip lebih dari 2,675 dan membulatkannya dengan benar. jika fraksi sudah melebihi konstanta kode, menambahkan 1e-15 tidak akan mengubah apa pun ke pembulatan.Beberapa kasus:
Untuk memperbaiki:
Jika Anda ingin lebih banyak desimal, misalnya 4, Anda harus menambahkan (+ 0,0000001).
Bekerja untukku.
sumber
Reproduksi sampel:
API: https://docs.python.org/3/library/functions.html#round
Menyatakan:
Dengan wawasan ini, Anda dapat menggunakan beberapa matematika untuk menyelesaikannya
sekarang Anda dapat menjalankan tes yang sama dengan my_round, bukan ronde.
sumber
Cara termudah untuk membulatkan dalam Python 3.x seperti yang diajarkan di sekolah adalah menggunakan variabel bantu:
Dan ini akan menjadi hasil dari seri 2.0 hingga 3.0 (dalam 0,1 langkah):
sumber
Anda dapat mengontrol pembulatan Anda menggunakan modul math.ceil:
sumber
Coba kode ini:
Hasilnya adalah:
Ooutput Anda dapat memeriksa di sini: https://i.stack.imgur.com/QQUkS.png
sumber