Masalah ini membunuhku. Bagaimana cara mengumpulkan angka UP di Python?
Saya mencoba putaran (angka) tetapi membulatkan angka ke bawah. Contoh:
round(2.3) = 2.0 and not 3, what I would like
Saya mencoba int (angka + .5) tetapi membulatkan angka ke bawah lagi! Contoh:
int(2.3 + .5) = 2
Kemudian saya mencoba putaran (angka + .5) tetapi tidak akan bekerja dalam kasus tepi. Contoh:
WAIT! THIS WORKED!
Mohon saran.
python
floating-point
integer
rounding
python-2.x
bodacydo
sumber
sumber
round(number + .5)
tidak berfungsi jika angka tersebut bilangan bulat.round(3+.5) == 4
, padahal sebenarnya Anda inginkan3
.Jawaban:
The ceil (langit-langit) fungsi:
sumber
int(math.ceil(363))
math.ceil
mengembalikan objek integer yang sebenarnya, bukan hanya objek mengambang dengan nilai integer.10000000 * 0.00136 = 13600.000000000002
langit-langit dapat meningkat banyakmath.ceil(10000000 * 0.00136) = 13601.0
Saya tahu jawaban ini untuk pertanyaan sejak beberapa waktu lalu, tetapi jika Anda tidak ingin mengimpor matematika dan Anda hanya ingin mengumpulkan, ini bekerja untuk saya.
Bagian pertama menjadi 4 dan bagian kedua mengevaluasi ke "Benar" jika ada sisanya, yang di samping Benar = 1; Salah = 0. Jadi jika tidak ada sisa, maka itu tetap bilangan bulat yang sama, tetapi jika ada sisanya menambahkan 1.
sumber
//
untuk divisi integer, jadi ini menjadi21 // 5 + (21 % 5 > 0)
.float
. Bagus.Masalah Python 2.x yang menarik untuk diingat:
Masalahnya adalah bahwa membagi dua int di python menghasilkan int lain dan itu terpotong sebelum panggilan langit-langit. Anda harus membuat satu nilai float (atau cast) untuk mendapatkan hasil yang benar.
Dalam javascript, kode yang sama persis menghasilkan hasil yang berbeda:
sumber
Jika bekerja dengan bilangan bulat, salah satu cara mengumpulkan adalah dengan mengambil keuntungan dari fakta yang
//
dibulatkan: Lakukan saja pembagian pada angka negatif, kemudian negasikan jawabannya. Tidak perlu impor, titik apung, atau bersyarat.Sebagai contoh:
sumber
(num + den - 1) // den
, yang baik untukint
input dengan penyebut positif, tetapi gagal jika bahkan non-integral tunggalfloat
terlibat (baik pembilang atau penyebut); ini lebih ajaib, tetapi bekerja untuk keduanyaint
danfloat
s. Untuk pembilang kecil, itu juga lebih cepat (pada CPython 3.7.2), meskipun anehnya, ketika hanya pembilang yang cukup besar yang dibutuhkan matematika berbasis array, pendekatan Anda lebih lambat; tidak jelas mengapa ini terjadi, karena pekerjaan pembagian harus serupa dan dua negasi unary harus lebih murah daripada penambahan + pengurangan.Anda mungkin juga suka numpy:
Saya tidak mengatakan ini lebih baik daripada matematika, tetapi jika Anda sudah menggunakan numpy untuk tujuan lain, Anda dapat menjaga kode Anda konsisten.
Bagaimanapun, hanya detail yang saya temui. Saya menggunakan banyak numpy dan terkejut itu tidak disebutkan, tetapi tentu saja jawaban yang diterima berfungsi dengan baik.
sumber
Gunakan
math.ceil
untuk mengumpulkan:CATATAN : Input harus mengambang.
Jika Anda membutuhkan integer, panggil
int
untuk mengubahnya:BTW, gunakan
math.floor
untuk membulatkan ke bawah danround
untuk membulatkan ke bilangan bulat terdekat.sumber
ceil()
akan menjaganya secara internalSintaksnya mungkin tidak se pythonic seperti yang mungkin disukai, tetapi ini adalah pustaka yang kuat.
https://docs.python.org/2/library/decimal.html
sumber
Saya terkejut tidak ada yang menyarankan
untuk divisi integer dengan pembulatan ke atas. Digunakan untuk menjadi cara umum untuk C / C ++ / CUDA (lih.
divup
)sumber
1
alih-alih menguranginya, atau membalikkan tanda pembilang dan penyebut sebelum melakukan perhitungan.Jadilah shure rounded value haruslah float
tapi
sumber
Coba ini:
sumber
((int(a) - a) != 0)
Ekspresi kembali1
setiap kalia
harus dibulatkan. Anda mungkin ingin memperluas jawaban dan menjelaskan cara kerjanya.Fungsi ini tidak memerlukan modul.
sumber
3
, maka itu akan menjadi4
yang mungkin atau tidak sesuai keinginan seseorangJawaban di atas benar, namun, mengimpor
math
modul hanya untuk fungsi yang satu ini biasanya terasa sedikit berlebihan bagi saya. Untungnya, ada cara lain untuk melakukannya:True
danFalse
ditafsirkan sebagai1
dan0
dalam pernyataan yang melibatkan angka dengan python.g.is_interger()
pada dasarnya diterjemahkan keg.has_no_decimal()
ataug == int(g)
. Jadi pernyataan terakhir dalam bahasa Inggris berbunyiround g down and add one if g has decimal
.sumber
int(g) + (g % 1 > 0)
;-)from math import ceil
tampaknya memperbaiki mengimpor seluruh modul matematika :)import math
apa yang terjadi di balik layar. Itu hanya menjatuhkan semua simbol kecualiceil
.Tanpa mengimpor matematika // menggunakan lingkungan dasar:
a) metode / metode kelas
b) lambda:
sumber
Bagi mereka yang ingin mengumpulkan
a / b
dan mendapatkan bilangan bulat:Varian lain yang menggunakan pembagian integer adalah
sumber
Jika ada orang yang mencari untuk dibulatkan ke tempat desimal tertentu:
sumber
Saya terkejut saya belum melihat jawaban ini
round(x + 0.4999)
, jadi saya akan meletakkannya. Perhatikan bahwa ini berfungsi dengan versi Python apa pun. Perubahan yang dibuat pada skema pembulatan Python telah membuat hal-hal sulit. Lihat posting ini .Tanpa mengimpor, saya menggunakan:
Kenapa ini bekerja?
Dari dokumen
Oleh karena itu 2,5 dibulatkan menjadi 2 dan 3,5 dibulatkan menjadi 4. Jika ini tidak terjadi maka pembulatan dapat dilakukan dengan menambahkan 0,5, tetapi kami ingin menghindari sampai ke titik setengah. Jadi, jika Anda menambahkan 0,4999 Anda akan mendekati, tetapi dengan margin yang cukup untuk dibulatkan ke apa yang biasanya Anda harapkan. Tentu saja, ini akan gagal jika
x + 0.4999
sama dengan[n].5000
, tetapi itu tidak mungkin.sumber
math.ceil()
?Without importing I use:
. Saya juga menyebutkan bahwa itu akan gagal jikax + 0.4999
sama dengan[n].5000
.math
modul danmath.ceil()
adalah di perpustakaan standar, sehingga tersedia di mana-mana untuk semua tujuan praktis tanpa menginstal hal ekstra. Dan mengenai penyebutan Anda ketika gagal, ini tidak lengkap dalam jawaban Anda, karena gagal untuk seluruh interval, bukan hanya untuk satu titik. Secara teknis, Anda bisa berargumen bahwa Anda benar, seperti yang Anda katakan jika dan bukan iff , tetapi itu akan membuat kesan pada pembaca biasa bahwa itu lebih kecil kemungkinannya daripada yang sebenarnya.Untuk melakukannya tanpa impor:
sumber
Saya tahu ini dari beberapa waktu yang lalu, tetapi saya menemukan jawaban yang cukup menarik, jadi begini:
Ini memperbaiki kasus tepi dan bekerja untuk angka positif dan negatif, dan tidak memerlukan impor fungsi
Bersulang
sumber
-round(-x-0.3) = x
ketika Anda mengoperasikan 4500/1000 dalam python, hasilnya akan menjadi 4, karena untuk ason python default sebagai bilangan bulat hasilnya, secara logis: 4500/1000 = 4,5 -> int (4.5) = 4 dan ceil of 4 jelaslly adalah 4
menggunakan 4500 / 1000.0 hasilnya akan 4,5 dan langit-langit 4,5 -> 5
Dengan menggunakan javascript, Anda akan menerima 4,5 sebagai hasil dari 4500/1000, karena javascript menganggap hanya hasilnya sebagai "tipe numerik" dan mengembalikan hasilnya secara langsung sebagai float
Semoga berhasil!!
sumber
/
selalu menghasilkan float, jadi4500/1000
selalu 4,5.Jika Anda tidak ingin mengimpor apa pun, Anda selalu dapat menulis fungsi sederhana Anda sendiri sebagai:
def RoundUP(num): if num== int(num): return num return int(num + 1)
sumber
Anda dapat menggunakan lantai devisi dan menambahkan 1 untuknya. 2.3 // 2 + 1
sumber
ceil()
alih-alih melakukan hal yang sebaliknya dan kemudian memberikan kompensasifrom math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Saya pikir Anda membingungkan mekanisme kerja antara
int()
danround()
.int()
selalu memotong angka desimal jika angka mengambang diberikan; sedangkanround()
, dalam hal di2.5
mana2
dan3
keduanya berada dalam jarak yang sama dari2.5
, Python mengembalikan mana yang lebih jauh dari titik 0.sumber
2.3
diubah menjadi3
, yang tidak terjadi pada contoh Anda.Bagian saya
Saya sudah menguji
print(-(-101 // 5)) = 21
contoh yang diberikan di atas.Sekarang untuk mengumpulkan:
Saya tidak bisa menggunakan
**
jadi saya menyebarkan multiply ke divisi:sumber
Saya pada dasarnya seorang pemula di Python, tetapi jika Anda hanya mencoba untuk mengumpulkan alih-alih mengapa tidak melakukannya:
sumber
round(integer + 0.5)
Inilah yang sering saya lakukan