Saya sudah mencoba untuk mengumpulkan angka float panjang seperti:
32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...
Tanpa keberhasilan sejauh ini. Saya mencoba math.ceil(x)
, math.floor(x)
(walaupun itu akan naik atau turun, yang bukan apa yang saya cari) dan round(x)
yang tidak berhasil (angka masih mengambang).
Apa yang dapat saya lakukan?
EDIT: KODE:
for i in widthRange:
for j in heightRange:
r, g, b = rgb_im.getpixel((i, j))
h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
h = h * 360
int(round(h))
print(h)
int(x)
Jawaban:
Akan membulatkannya dan mengubahnya menjadi bilangan bulat
EDIT:
Anda tidak memberikan int (putaran (h)) ke variabel apa pun. Saat Anda memanggil int (bulat (h)), ia mengembalikan nomor integer tetapi tidak melakukan hal lain; Anda harus mengubah baris itu untuk:
Untuk menetapkan nilai baru ke h
EDIT 2:
Seperti @plowman katakan dalam komentar, Python
round()
tidak bekerja seperti yang biasanya diharapkan, dan itu karena cara nomor disimpan sebagai variabel biasanya bukan cara Anda melihatnya di layar. Ada banyak jawaban yang menjelaskan perilaku ini:round () tampaknya tidak membulatkan dengan benar
Salah satu cara untuk menghindari masalah ini adalah dengan menggunakan Desimal seperti yang dinyatakan oleh jawaban ini: https://stackoverflow.com/a/15398691/4345659
Agar jawaban ini berfungsi dengan baik tanpa menggunakan pustaka tambahan, akan lebih mudah untuk menggunakan fungsi pembulatan khusus. Setelah banyak koreksi, saya datang dengan solusi berikut, yang sejauh ini saya uji menghindari semua masalah penyimpanan. Ini didasarkan pada penggunaan representasi string, yang diperoleh dengan
repr()
(TIDAKstr()
!). Kelihatannya berantakan tapi itu satu-satunya cara yang saya temukan untuk menyelesaikan semua kasus. Ia bekerja dengan kedua Python2 dan Python3.Tes:
Akhirnya, jawaban yang diperbaiki adalah:
EDIT 3:
Tes:
Gotcha di sini adalah bahwa
dec
desimal -th bisa menjadi 9 dan jikadec+1
digit -th> = 5 maka 9 akan menjadi 0 dan 1 harus dibawa kedec-1
digit -th.Jika kami mempertimbangkan hal ini, kami mendapatkan:
Dalam situasi yang diuraikan di atas
b = 10
dan versi sebelumnya hanya akan menyatukana
danb
yang akan menghasilkan rangkaian di10
mana trailing 0 akan menghilang. Versi ini berubahb
menjadi tempat desimal yang tepat berdasarkandec
, sebagai carry yang tepat.sumber
int(round(4.5))
membulatkan ke 4 sementaraint(round(4.500001))
dengan benar membulatkan ke 5.round(x)
cukup dengan Python 3.6.2 (dan mungkin versi yang lebih rendah juga). Hasilnya sudah bertipe int. Catatan:round(x, n)
akan dari tipe float.Gunakan
round(x, y)
. Ini akan mengumpulkan nomor Anda hingga tempat desimal yang Anda inginkan.Sebagai contoh:
sumber
round(value,significantDigit)
adalah solusi biasa, namun ini tidak beroperasi seperti yang diharapkan dari perspektif matematika ketika nilai bulat berakhir5
. Jika5
ada di digit tepat setelah angka yang dibulatkan, nilai-nilai ini kadang-kadang hanya dibulatkan seperti yang diharapkan (yaitu8.005
membulatkan menjadi dua digit desimal8.01
). Untuk nilai tertentu karena keanehan matematika floating point, mereka dibulatkan ke bawah!yaitu
Aneh.
Dengan asumsi tujuan Anda adalah melakukan pembulatan statistik tradisional dalam sains, ini adalah pembungkus yang berguna untuk membuat
round
fungsi berfungsi seperti yang diharapkan membutuhkanimport
hal-hal tambahan sepertiDecimal
.Aha! Jadi berdasarkan ini kita dapat membuat fungsi ...
Pada dasarnya ini menambahkan nilai yang dijamin lebih kecil dari digit string yang paling sedikit Anda coba gunakan
round
. Dengan menambahkan jumlah kecil itu mempertahankanround
perilaku dalam banyak kasus, sementara sekarang memastikan jika angka lebih rendah daripada yang dibulatkan adalah5
itu dibulatkan ke atas, dan jika4
itu dibulatkan ke bawah.Pendekatan penggunaan
10**(-len(val)-1)
itu disengaja, karena jumlah kecil terbesar yang dapat Anda tambahkan untuk memaksa perubahan, sambil juga memastikan bahwa nilai yang Anda tambahkan tidak pernah mengubah pembulatan bahkan jika desimal.
hilang. Saya bisa menggunakan hanya10**(-len(val))
dengan persyaratanif (val>1)
untuk mengurangi1
lebih banyak ... tapi lebih mudah untuk selalu mengurangi1
karena tidak akan banyak mengubah rentang angka desimal yang dapat diatasi dengan solusi ini. Pendekatan ini akan gagal jika nilai Anda mencapai batas tipe, ini akan gagal, tetapi untuk hampir seluruh rentang nilai desimal yang valid, itu harus bekerja.Anda juga dapat menggunakan pustaka desimal untuk mencapai hal ini, tetapi pembungkus yang saya usulkan lebih sederhana dan mungkin lebih disukai dalam beberapa kasus.
Sunting: Terima kasih Blckknght untuk menunjukkan bahwa
5
kasus pinggiran hanya terjadi untuk nilai-nilai tertentu. Juga versi sebelumnya dari jawaban ini tidak cukup eksplisit sehingga perilaku pembulatan ganjil hanya terjadi ketika digit langsung kalah dengan digit yang Anda bulatkan memiliki5
.sumber
5
karena digit terakhirnya akan selalu bulat. Itu tidak terjadi di tes cepat saya hanya lakukan dengan nomor seperti1.5
,2.5
,3.5
dan seterusnya dan1.05
,1.15
,1.25
,1.35
pembulatan ke satu tempat desimal. Set pertama (tepat membagi dua pembulatan ke bilangan bulat kecil) selalu membulatkan ke bilangan bulat genap. Set terakhir tidak bulat secara konsisten, mungkin karena representasi biner yang tidak tepat dari beberapa nilai. Apung yang memiliki representasi biner yang tepat seperti1.25
bulat memiliki angka yang bahkan paling signifikan, tetapi yang lain tampak bulat secara acak.round(4.0005,3)
memberi4.0
danround(1.0005,3)
memberi1.0
, tetapiround(2.0005,3)
memberi2.001
danround(3.0005,3)
memberi3.001
. Tapi itulah tepatnya mengapa solusi yang saya usulkan diperlukan ... Anda tidak tahu apa yang diharapkan dari putaran stok, dalam kasus penting ini!, digits
pada akhir pernyataan pengembalian itu? Tidak ada pelesetan yang dimaksudkan. ( Maksudku, maksudku)Untuk yang positif, cobalah
Untuk membuatnya bekerja untuk yang negatif juga, cobalah
int()
berfungsi seperti fungsi lantai dan karenanya Anda dapat memanfaatkan properti ini. Ini jelas cara tercepat.sumber
>>> x=-0.999
>>> int(x), round(x), int(x+0.5)
(0, -1.0, 0)
Bukankah hanya Python melakukan setengah hingga genap , seperti yang ditentukan oleh IEEE 754 ?
Hati-hati mendefinisikan ulang, atau menggunakan pembulatan "non-standar" ...
(Lihat juga https://stackoverflow.com/a/33019948/109839 )
sumber
Round half to even
sama sekali tidak ditentukan oleh IEEE 754, tetapi hanya salah satu dari beberapa opsi pembulatan yang dijelaskan oleh standar .Round to nearest, ties away from zero
(yaitu perilaku yang kebanyakan orang harapkan) juga merupakan opsi, dan merupakan default di, misalnya, C / C ++.round
dijelaskan) dan itu melakukannya sesuai dengan cara "round half to even" yang ditentukan untuk bekerja (atau dijelaskan) oleh standar.Anda juga dapat menggunakan asumsi numpy jika Anda menggunakan python3.x di sini adalah contohnya
sumber
Solusi Anda dipanggil putaran tanpa menentukan argumen kedua (jumlah tempat desimal)
yang merupakan hasil yang jauh lebih baik daripada
Dari dokumentasi Python di https://docs.python.org/3/library/functions.html#round
sumber
Jika Anda memerlukan (misalnya) perkiraan dua digit untuk A, maka
int(A*100+0.5)/100.0
akan melakukan apa yang Anda cari.Jika Anda membutuhkan perkiraan tiga digit, kalikan dan bagi dengan 1.000 dan seterusnya.
sumber
Beberapa hal seperti ini juga harus bekerja
sumber
Untuk tujuan ini saya sarankan lakukan saja hal berikut -
Ini akan memberi Anda bilangan bulat terdekat.
Semoga ini membantu!!
sumber
Saya menggunakan dan dapat menyarankan solusi berikut (python3.6):
Ini berfungsi dengan baik untuk setengah angka (positif dan negatif) dan bekerja lebih cepat daripada int (putaran (x)):
sumber