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

Jawaban:


477

Sertakan specifier jenis dalam ekspresi format Anda:

>>> a = 10.1234
>>> f'{a:.2f}'
'10.12'

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'

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'

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$

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


-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


ini tidak ada hubungannya dengan pertanyaan dan akun ini belum aktif sejak posting ini
— Nicolas Gervais
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.