Bagaimana saya bisa memformat float sehingga tidak mengandung nol tambahan? Dengan kata lain, saya ingin string yang dihasilkan sesingkat mungkin.
Sebagai contoh:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
Bagaimana saya bisa memformat float sehingga tidak mengandung nol tambahan? Dengan kata lain, saya ingin string yang dihasilkan sesingkat mungkin.
Sebagai contoh:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
3.14 == 3.140
- Mereka nomor floating point yang sama . Dalam hal ini 3.140000 adalah angka floating-point yang sama. Angka nol tidak ada sejak awal.%0.2f
dan%0.3f
dua format yang diperlukan untuk menghasilkan angka terakhir di sebelah kiri. Gunakan%0.2f
untuk menghasilkan dua angka terakhir di sebelah kanan.3.0 -> "3"
masih merupakan use case yang valid.print( '{:,g}'.format( X )
bekerja untuk saya untuk output di3
manaX = 6 / 2
dan kapanX = 5 / 2
saya mendapatkan output2.5
seperti yang diharapkan.print("%s"%3.140)
memberi Anda apa yang Anda inginkan. (Saya menambahkan jawaban di bawah ...)Jawaban:
Saya, saya akan lakukan
('%f' % x).rstrip('0').rstrip('.')
- menjamin pemformatan titik tetap daripada notasi ilmiah, dll. Ya, tidak selipis dan seanggun%g
, tapi, itu berfungsi (dan saya tidak tahu bagaimana memaksa%g
untuk tidak pernah menggunakan notasi ilmiah; -).sumber
'%.2f' % -0.0001
akan meninggalkan Anda-0.00
dan akhirnya-0
.'f' Fixed point. Displays the number as a fixed-point number. The default precision is 6.
Anda harus menggunakan '% 0.7f' dalam solusi di atas.'%0.15f'
adalah ide yang buruk, karena hal-hal aneh mulai terjadi.print('In the middle {} and something else'.format('{:f}'.format(a).rstrip('0')))
rstrip
perintah ganda . Gunakan ini sebagai gantinya untuk menghapus titik (.
) dan semua nol tambahan setelahnya dalam satu operasi:('%f' % x).rstrip('.0')
Anda dapat menggunakan
%g
untuk mencapai ini:atau, untuk Python 2.6 atau lebih baik:
Dari dokumen untuk
format
:g
penyebab (antara lain)sumber
'{0:...}'.format(value)
saat Anda bisa menggunakannyaformat(value, '...')
? Itu menghindari harus mem-parsing specifier format dari string template yang dinyatakan kosong.format(v, '2.5f')
memakan waktu ~ 10% lebih lama dari'{:2.5f}'.format(v)
. Bahkan jika tidak, saya cenderung menggunakanstr
formulir metode karena ketika saya perlu men-tweak, menambahkan nilai tambahan, dll, ada sedikit perubahan. Tentu saja, pada 3.6 kita memiliki f-string untuk sebagian besar tujuan. :-)f"{var:g}"
manavar
adalah variabel float.Bagaimana dengan mencoba pendekatan yang paling mudah dan mungkin paling efektif? Metode menormalkan () menghapus semua nol trailing paling kanan.
Bekerja di Python 2 dan Python 3 .
- Diperbarui -
Satu-satunya masalah seperti yang ditunjukkan oleh @ BobStein-VisiBone, adalah angka-angka seperti 10, 100, 1000 ... akan ditampilkan dalam representasi eksponensial. Ini dapat dengan mudah diperbaiki menggunakan fungsi berikut sebagai gantinya:
sumber
Decimal('10.0').normalize()
menjadi'1E+1'
Setelah mencari jawaban atas beberapa pertanyaan serupa, ini tampaknya menjadi solusi terbaik bagi saya:
Alasan saya:
%g
tidak menghilangkan notasi ilmiah.15 tempat desimal tampaknya menghindari perilaku aneh dan memiliki banyak ketepatan untuk kebutuhan saya.
Saya bisa menggunakan
format(inputValue, '.15f').
bukan'%.15f' % inputValue
, tapi itu sedikit lebih lambat (~ 30%).Saya bisa menggunakan
Decimal(inputValue).normalize()
, tetapi ini memiliki beberapa masalah juga. Untuk satu, itu BANYAK lebih lambat (~ 11x). Saya juga menemukan bahwa meskipun memiliki presisi yang sangat bagus, ia masih mengalami kehilangan presisi saat menggunakannormalize()
.Yang paling penting, saya masih akan mengkonversi
Decimal
darifloat
yang dapat membuat Anda berakhir dengan sesuatu selain nomor yang Anda masukkan di sana. Saya pikirDecimal
bekerja paling baik ketika aritmatika tetapDecimal
danDecimal
diinisialisasi dengan string.Saya yakin masalah presisi
Decimal.normalize()
dapat disesuaikan dengan apa yang diperlukan menggunakan pengaturan konteks, tetapi mengingat kecepatan yang sudah lambat dan tidak memerlukan presisi yang konyol dan fakta bahwa saya masih akan mengkonversi dari float dan kehilangan presisi, saya tidak pikir itu layak dikejar.Saya tidak khawatir dengan kemungkinan hasil "-0" karena -0.0 adalah angka floating point yang valid dan mungkin akan menjadi kejadian yang jarang terjadi, tetapi karena Anda memang menyebutkan Anda ingin menjaga hasil string sesingkat mungkin, Anda selalu dapat menggunakan persyaratan ekstra dengan biaya kecepatan ekstra yang sangat kecil.
sumber
floatToString(12345.6)
kembali'12345.600000000000364'
misalnya. Mengurangi angka 15%.15f
ke angka yang lebih rendah memecahkannya dalam contoh ini, tetapi nilai itu perlu diturunkan lebih dan lebih lagi ketika jumlahnya semakin besar. Ini bisa dihitung secara dinamis berdasarkan log-base-10 dari angka tersebut, tetapi itu dengan cepat menjadi sangat rumit.result = ('%15f' % val).rstrip('0').rstrip('.').lstrip(' ')
>>>12345.600000000000364 == 12345.6
True
Inilah solusi yang bekerja untuk saya. Ini adalah campuran dari solusi oleh PolyMesh dan penggunaan
.format()
sintaks baru .Output :
sumber
3.141
) karena.2f
hard-coded.Anda cukup menggunakan format () untuk mencapai ini:
format(3.140, '.10g')
di mana 10 adalah presisi yang Anda inginkan.sumber
sumber
int(a) if a % 1 else a
?a if a % 1 else int(a)
benar. Pertanyaan membutuhkan output dalam string, Jadi saya baru saja menambahkanstr
a % 1
adalah kebenaran karena itu bukan nol. Saya secara implisit dan keliru menganggapnya sebagaia % 1 == 0
.Sementara memformat sepertinya cara Pythonic yang paling, di sini adalah solusi alternatif menggunakan
more_itertools.rstrip
alat.Angka tersebut dikonversi menjadi string, yang dilucuti dari karakter trailing yang memenuhi predikat. Definisi fungsi
fmt
tidak diperlukan, tetapi digunakan di sini untuk menguji pernyataan, yang semuanya lulus. Catatan: ini bekerja pada input string dan menerima predikat opsional.Lihat juga detail di perpustakaan pihak ketiga ini
more_itertools
,.sumber
Jika Anda dapat hidup dengan 3. dan 3.0 yang muncul sebagai "3.0", pendekatan yang sangat sederhana yang melucuti nol dari representasi float:
(terima kasih @ellimilial karena menunjukkan pengecualian)
sumber
print("%s"%3.0)
demikian.Menggunakan paket QuantiPhy adalah sebuah opsi. Biasanya QuantiPhy digunakan ketika bekerja dengan angka dengan unit dan faktor skala SI, tetapi memiliki berbagai opsi pemformatan angka yang bagus.
Dan itu tidak akan menggunakan e-notasi dalam situasi ini:
Alternatif yang mungkin Anda sukai adalah menggunakan faktor skala SI, mungkin dengan satuan.
sumber
OP ingin menghapus nol superflouous dan membuat string yang dihasilkan sesingkat mungkin.
Saya menemukan format% g eksponensial memendekkan string yang dihasilkan untuk nilai yang sangat besar dan sangat kecil. Masalahnya muncul untuk nilai yang tidak memerlukan notasi eksponensial, seperti 128.0, yang tidak terlalu besar atau sangat kecil.
Berikut adalah salah satu cara untuk memformat angka sebagai string pendek yang menggunakan notasi eksponensial% g hanya ketika Decimal.normalisasi membuat string yang terlalu panjang. Ini mungkin bukan solusi tercepat (karena memang menggunakan Decimal.normalisasi)
sumber
Untuk float Anda bisa menggunakan ini:
Menguji:
Untuk solusi Desimal lihat di sini: https://stackoverflow.com/a/42668598/5917543
sumber
"{:.5g}".format(x)
Saya menggunakan ini untuk memformat mengapung untuk melacak nol.
sumber
Inilah jawabannya:
output "3.14" dan "3"
trim='-'
menghapus kedua trailing zero, dan desimal.sumber
Gunakan% g dengan lebar yang cukup besar, misalnya '% .99g'. Ini akan mencetak dalam notasi titik tetap untuk nomor yang cukup besar.
EDIT: tidak bekerja
sumber
.99
presisi, bukan lebar; agak berguna tetapi Anda tidak bisa mengatur presisi aktual dengan cara ini (selain memotongnya sendiri).Anda bisa menggunakan
max()
seperti ini:print(max(int(x), x))
sumber
x
negatif.if x < 0: print(min(x), x)
else : print(max(x), x)
Anda dapat mencapainya dengan cara pythonic seperti itu:
python3:
sumber
Menangani% f dan Anda harus meletakkan
, di mana: .2f == .00 floats.
Contoh:
cetak "Harga:% .2f"% harga [produk]
keluaran:
Harga: 1,50
sumber