Dokumentasi untuk fungsi round () menyatakan bahwa Anda memberikan angka, dan posisi melewati desimal untuk membulatkan. Jadi harus melakukan ini:
n = 5.59
round(n, 1) # 5.6
Tapi, pada kenyataannya, keanehan floating point tua yang bagus merayap masuk dan Anda mendapatkan:
5.5999999999999996
Untuk keperluan UI, saya perlu menampilkan 5.6
. Saya mencari-cari di Internet dan menemukan beberapa dokumentasi yang bergantung pada implementasi Python saya. Sayangnya, ini terjadi pada mesin pengembang Windows saya dan setiap server Linux yang pernah saya coba. Lihat di sini juga .
Singkatnya membuat perpustakaan bundar saya sendiri, apakah ada cara lain?
python
floating-point
rounding
swilliams
sumber
sumber
round(5.55, 1) = 5.5
.Jawaban:
Saya tidak dapat membantu cara penyimpanannya, tetapi setidaknya pemformatan berfungsi dengan benar:
sumber
print '%.2f' % 655.665
tetapi itu kembali655.66
, seharusnya655.67
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_DOWN
# gunakan dalam pembulatan angka mengambangDecimal(str(655.665)).quantize(Decimal('1.11'), rounding=ROUND_HALF_UP)
# Masalah dan Batasan dalam floating pointPemformatan bekerja dengan benar bahkan tanpa harus dibulatkan:
sumber
"{:.1f}".format(n)
'%.5f' % 0.988625
memberi0.98862
Jika Anda menggunakan modul Desimal, Anda dapat memperkirakan tanpa menggunakan fungsi 'bulat'. Inilah yang telah saya gunakan untuk pembulatan terutama saat menulis aplikasi moneter:
Ini akan mengembalikan Angka Desimal yaitu 16.20.
sumber
rounding='ROUND_UP'
NameError: global name 'ROUND_UP' is not defined
Anda perlu mengimpor fungsi pembulatan Anda:from decimal import Decimal, ROUND_UP
. Fungsi pembulatan lainnyaround(5.59, 1)
bekerja dengan baik. Masalahnya adalah 5.6 tidak dapat direpresentasikan dengan tepat dalam binary floating point.Seperti yang dikatakan Vinko, Anda dapat menggunakan pemformatan string untuk melakukan pembulatan tampilan.
Python memiliki modul untuk aritmatika desimal jika Anda membutuhkannya.
sumber
Anda mendapatkan '5.6' jika Anda melakukannya,
str(round(n, 1))
bukan hanyaround(n, 1)
.sumber
Anda dapat mengganti tipe data menjadi integer:
Dan kemudian tampilkan angkanya dengan memasukkan pemisah desimal lokal.
Namun, jawaban Jimmy lebih baik.
sumber
Matematika floating point rentan terhadap ketidakakuratan presisi yang ringan, tetapi mengganggu. Jika Anda dapat bekerja dengan integer atau titik tetap, Anda akan dijamin presisi.
sumber
Lihatlah modul Desimal
dan
Desimal menyediakan jenis operasi yang memudahkan penulisan aplikasi yang memerlukan operasi floating point dan juga perlu menyajikan hasil tersebut dalam format yang dapat dibaca manusia, misalnya, akuntansi.
sumber
printf si pengisap.
sumber
Ini memang masalah besar. Coba kode ini:
Ini menampilkan 4,85. Kemudian Anda melakukan:
dan itu menunjukkan 4.8. Apakah Anda menghitung dengan tangan, jawaban pastinya adalah 4,85, tetapi jika Anda mencoba:
Anda bisa melihat kebenarannya: titik pelampung disimpan sebagai penjumlahan terbatas terdekat dari pecahan yang penyebutnya adalah pangkat dua.
sumber
Anda dapat menggunakan operator format string
%
, mirip dengan sprintf.sumber
Bekerja dengan Sempurna
sumber
Saya lakukan:
Dalam hal ini, pertama kita membulatkan dengan benar pada level unit, kemudian kita ubah menjadi integer untuk menghindari pencetakan float.
begitu
Saya pikir jawaban ini bekerja lebih baik daripada memformat string, dan juga lebih masuk akal bagi saya untuk menggunakan fungsi bulat.
sumber
Saya akan menghindari mengandalkan
round()
sama sekali dalam kasus ini. Mempertimbangkanakan mengeluarkan
yang bukan merupakan keluaran yang diinginkan jika Anda membutuhkan pembulatan solid ke bilangan bulat terdekat. Untuk melewati perilaku ini, ikuti
math.ceil()
(ataumath.floor()
jika Anda ingin membulatkan ke bawah):keluaran
Semoga membantu.
sumber
Kode:
Keluaran:
sumber
Di sinilah saya melihat ronde gagal. Bagaimana jika Anda ingin membulatkan 2 angka ini menjadi satu tempat desimal? 23.45 23.55 Pendidikan saya adalah dari pembulatan ini anda akan mendapatkan: 23.4 23.6 "aturannya" adalah anda harus membulatkan jika bilangan sebelumnya ganjil, bukan pembulatan jika bilangan sebelumnya genap. Fungsi bulat di python hanya memotong 5.
sumber
Masalahnya hanya jika digit terakhir adalah 5. Mis. 0,045 disimpan secara internal sebagai 0,044999999999999 ... Anda cukup menaikkan digit terakhir menjadi 6 dan membulatkannya. Ini akan memberi Anda hasil yang diinginkan.
sumber
Opsi potensial lainnya adalah:
sumber
Bagaimana dengan:
sumber
epsilon = .000001
kemudianround(1.0/5.0, 1) + epsilon
akan mengambil representasi yang tepat 0,2 dan menjadikannya 0,00001. Masalah yang sama buruknya akan terjadi jika epsilon berada di dalam fungsi putaran.