Konversi angka floating point ke presisi tertentu, dan kemudian salin ke string

144

Saya memiliki nomor floating point, katakanlah 135.12345678910. Saya ingin menggabungkan nilai itu ke string, tetapi hanya ingin 135.123456789. Dengan cetak, saya dapat dengan mudah melakukan ini dengan melakukan sesuatu seperti:

print "%.9f" % numvar

dengan numvarmenjadi nomor asli saya. Apakah ada cara mudah untuk melakukan ini?

pauliwago
sumber
3
% persisnya -% bukan bagian dari fungsi cetak tetapi dari string - lihat Python docs
michael_s

Jawaban:

177

Dengan Python <3 (mis. 2.6 [lihat komentar] atau 2.7), ada dua cara untuk melakukannya.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Tetapi perhatikan bahwa untuk versi Python di atas 3 (mis. 3.2 atau 3.3), opsi dua lebih disukai .

Untuk informasi lebih lanjut tentang opsi dua, saya sarankan tautan ini pada pemformatan string dari dokumentasi Python .

Dan untuk informasi lebih lanjut tentang opsi satu, tautan ini akan cukup dan memiliki info tentang berbagai flag .

Python 3.6 (secara resmi dirilis pada bulan Desember 2016), menambahkan fstring literal, lihat informasi lebih lanjut di sini , yang memperluas str.formatmetode (penggunaan kurung kurawal sedemikian rupa sehingga f"{numvar:.9f}"memecahkan masalah asli), yaitu,

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

memecahkan masalah. Periksa jawaban @ Or-Duan untuk info lebih lanjut, tetapi metode ini cepat .

HAL 9001
sumber
1
opsi dua harus newer_method_string = "{:.9f}".format(numvar)- perhatikan wajib :untuk memisahkan bidang dan format. Saya sudah menguji ini pada 2.7.5.
Caltor
1
Untuk python 2.6, pilihan kedua harus newer_method_string = "{0:.9f}".format(numvar)- perhatikan 0 yang diperlukan untuk field_name untuk versi yang lebih lama ini.
ttq
56

Python 3.6

Hanya untuk membuatnya jelas, Anda dapat menggunakan pemformatan f-string . Ini memiliki sintaks yang hampir sama dengan formatmetode, tetapi membuatnya sedikit lebih bagus.

Contoh:

print(f'{numvar:.9f}')

Lebih banyak membaca tentang string f baru:

Berikut adalah diagram waktu eksekusi berbagai metode yang diuji (dari tautan terakhir di atas):

waktu eksekusi

Atau Duan
sumber
52

Menggunakan round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'
shantanoo
sumber
8

Ini bukan cetak yang melakukan pemformatan, Ini properti string, jadi Anda bisa menggunakannya

newstring = "%.9f" % numvar
John La Rooy
sumber
Atau gunakan pemformatan gaya baru. valueString = "{:. 9f}". format (angka)
Zaren
8

Jika presisi tidak diketahui hingga runtime, opsi pemformatan lain ini berguna:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'
Yu Hao
sumber
3
Jika Anda lebih memilih untuk menggunakan .format-metode, catatan bahwa ini juga dapat dilakukan dengan argumen bersarang suka begitu: '{:.{n}f}'.format(numvar,n=n).
nivk
2

Untuk mengatur presisi dengan 9 digit, dapatkan:

print "%.9f" % numvar

Mengembalikan presisi dengan 2 digit:

print "%.2f" % numvar 

Mengembalikan presisi dengan 2 digit dan mengapung nilai yang dikonversi:

numvar = 4.2345
print float("%.2f" % numvar) 
Tejas Tank
sumber
-2

The strfungsi memiliki bug. Silakan coba yang berikut ini. Anda akan melihat '0,196553' tetapi output yang tepat adalah '0,196554'. Karena nilai strdefault fungsi adalah ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")
ethemsulan
sumber
2
Ada apa dengan .vs ,? Dan bagaimana itu relevan untuk pertanyaan pauliwago?
Peter Mortensen