Memperbaiki digit setelah desimal dengan f-string

320

Apakah ada cara mudah dengan Python f-string untuk memperbaiki jumlah digit setelah titik desimal? (Khususnya f-string, bukan opsi pemformatan string lain seperti .format atau%)

Sebagai contoh, katakanlah saya ingin menampilkan 2 digit setelah tempat desimal.

Bagaimana aku melakukan itu? Katakan saja itu

a = 10.1234
GafferMan2112
sumber

Jawaban:

477

Sertakan specifier jenis dalam ekspresi format Anda:

>>> a = 10.1234
>>> f'{a:.2f}'
'10.12'
Robᵩ
sumber
33
Tidak ada contoh format f-string yang saya temukan, termasuk PEP, menunjukkan Anda dapat menggunakan specifier tipe. Saya kira saya seharusnya mengasumsikan itu, tetapi dokumen yang memanggilnya akan bagus.
GafferMan2112
Anda benar, sebagian besar contoh tidak memiliki penentu format. Dalam PEP, contoh hex melakukan f'input={value:#06x}':, dan contoh datetime melakukan: {anniversary:%A, %B %d, %Y}dan {date:%A}. Saya pikir penjelasan kuncinya ada di bagian Kode Kesetaraan .
Robᵩ
9
Oh man, ini indah dan sederhana. Mengapa saya membutuhkan waktu lebih dari 45 detik untuk menemukan jawaban ini? Up ya game, Google.
Matt Fletcher
2
juga perhatikan bahwa tanpa f jika Anda menulis - f '{a: .2}' itu akan menghitung jumlah total digit dan jawabannya akan menjadi 10
Drako
88

Ketika datang ke floatangka, Anda dapat menggunakan penentu format :

f'{value:{width}.{precision}}'

dimana:

  • value adalah setiap ekspresi yang mengevaluasi ke suatu angka
  • widthmenentukan jumlah karakter yang digunakan secara total untuk ditampilkan, tetapi jika valuemembutuhkan lebih banyak ruang daripada lebar menentukan maka ruang tambahan digunakan.
  • precision menunjukkan jumlah karakter yang digunakan setelah titik desimal

Apa yang Anda lewatkan adalah specifier tipe untuk nilai desimal Anda. Di tautan ini , Anda dapat menemukan tipe presentasi yang tersedia untuk floating point dan desimal.

Di sini Anda memiliki beberapa contoh, menggunakan ftipe presentasi (titik tetap):

# notice that it adds spaces to reach the number of characters specified by width
In [1]: f'{1 + 3 * 1.5:10.3f}'
Out[1]: '     5.500'

# notice that it uses more characters than the ones specified in width
In [2]: f'{3000 + 3 ** (1 / 2):2.1f}' 
Out[2]: '3001.7'

In [3]: f'{1.2345 + 4 ** (1 / 2):9.6f}'
Out[3]: ' 3.234500'

# omitting width but providing precision will use the required characters to display the number with the the specified decimal places
In [4]: f'{1.2345 + 3 * 2:.3f}' 
Out[4]: '7.234'

# not specifying the format will display the number with as many digits as Python calculates
In [5]: f'{1.2345 + 3 * 0.5}'
Out[5]: '2.7344999999999997'
lmiguelvargasf
sumber
34

Menambah jawaban Robᵩ: jika Anda ingin mencetak angka yang agak besar, menggunakan ribuan pemisah bisa sangat membantu (perhatikan koma).

>>> f'{a*1000:,.2f}'
'10,123.40'
Bouncner
sumber
15

Gunakan penentu format dengan f strings ( selengkapnya di sini ).

  • Anda dapat mengontrol jumlah desimal :
pi = 3.141592653589793238462643383279

print(f'The first 6 decimals of pi are {pi:.6f}.')
The first 6 decimals of pi are 3.141593.
  • Anda dapat mengonversi ke persentase :
grade = 29/45

print(f'My grade rounded to 3 decimals is {grade:.3%}.')
My grade rounded to 3 decimals is 64.444%.
  • Anda dapat melakukan hal lain seperti mencetak panjang konstan :
from random import randint
for i in range(5):
    print(f'My money is {randint(0, 150):>3}$')
My money is 126$
My money is   7$
My money is 136$
My money is  15$
My money is  88$
  • Atau bahkan mencetak dengan pemisah ribuan koma :
print(f'I am worth {10000000000:,}$')
I am worth 10,000,000,000$
Nicolas Gervais
sumber
1
a = 10.1234

print(f"{a:0.2f}")

dalam 0.2f:

  • 0 memberitahu python untuk tidak membatasi jumlah digit yang akan ditampilkan
  • .2 mengatakan bahwa kita ingin mengambil hanya 2 digit setelah desimal (hasilnya akan sama dengan fungsi round ())
  • f mengatakan bahwa itu adalah angka float. Jika Anda lupa f maka itu hanya akan mencetak 1 digit lebih sedikit setelah desimal. Dalam hal ini, hanya akan 1 digit setelah desimal.

Video terperinci tentang f-string untuk angka https://youtu.be/RtKUsUTY6to?t=606

Rahul Sharma
sumber
-2

Untuk pembulatan ...

import datetime as dt
now = dt.datetime(2000, 1, 30, 15, 10, 15, 900)
now_mil = round(now.microsecond/1000)
print(f"{now:%Y/%m/%d %H:%M:%S.}{now_mil:03}")

Output: 2000/01/30 15: 10: 15.001

Kevin
sumber
ini tidak ada hubungannya dengan pertanyaan dan akun ini belum aktif sejak posting ini
Nicolas Gervais