
精度控制是字符串格式化中的重要功能,主要用于控制浮点数的小数位数 、字符串的截断长度等。不同格式化方式的精度控制语法略有不同。
一、精度控制
| 格式化方式 | 浮点数精度 | 字符串截断 | 示例 |
|---|---|---|---|
% 格式化 |
%.2f |
%.3s |
"%.2f" % 3.14159 |
str.format() |
{:.2f} |
{:.3} |
"{:.2f}".format(3.14159) |
| f-string | {value:.2f} |
{value:.3} |
f"{pi:.2f}" |
二、% 格式化的精度控制
1. 浮点数精度
# 基本用法
pi = 3.141592653589793
print("%.0f" % pi) # 3(0 位小数)
print("%.1f" % pi) # 3.1
print("%.2f" % pi) # 3.14
print("%.4f" % pi) # 3.1416(四舍五入)
print("%.10f" % pi) # 3.1415926536
# 结合宽度
print("%8.2f" % pi) # ' 3.14'
print("%08.2f" % pi) # '00003.14'
# 科学计数法精度
print("%.2e" % pi) # 3.14e+00
print("%.4e" % pi) # 3.1416e+00
2. 字符串截断
text = "Hello World"
# 截断字符串(保留前 n 个字符)
print("%.3s" % text) # Hel
print("%.5s" % text) # Hello
print("%.10s" % text) # Hello Worl
# 结合宽度
print("%10.3s" % text) # ' Hel'(右对齐,宽度10)
print("%-10.3s" % text)# 'Hel '(左对齐)
3. 整数精度(补零)
# 整数的精度实际上是宽度补零
print("%.5d" % 42) # 00042
print("%.8d" % 123) # 00000123
print("%.0d" % 42) # 42(不补零)
三、str.format() 的精度控制
1. 浮点数精度
pi = 3.141592653589793
# 基本用法
print("{:.0f}".format(pi)) # 3
print("{:.1f}".format(pi)) # 3.1
print("{:.2f}".format(pi)) # 3.14
print("{:.4f}".format(pi)) # 3.1416
print("{:.10f}".format(pi)) # 3.1415926536
# 结合宽度
print("{:8.2f}".format(pi)) # ' 3.14'
print("{:08.2f}".format(pi)) # '00003.14'
# 科学计数法
print("{:.2e}".format(pi)) # 3.14e+00
print("{:.4e}".format(pi)) # 3.1416e+00
# 百分比(精度控制)
ratio = 0.875
print("{:.0%}".format(ratio)) # 88%
print("{:.1%}".format(ratio)) # 87.5%
print("{:.2%}".format(ratio)) # 87.50%
2. 字符串截断
text = "Hello World"
# 截断字符串
print("{:.3}".format(text)) # Hel
print("{:.5}".format(text)) # Hello
print("{:.8}".format(text)) # Hello Wo
print("{:.0}".format(text)) # (空字符串)
# 结合对齐
print("{:>10.3}".format(text)) # ' Hel'
print("{:<10.3}".format(text)) # 'Hel '
print("{:^10.3}".format(text)) # ' Hel '
3. 整数精度(补零)
print("{:.5d}".format(42)) # 00042
print("{:.8d}".format(123)) # 00000123
# 可以省略 d
print("{:.5}".format(42)) # 00042(自动识别类型)
四、f-string 的精度控制
1. 浮点数精度
pi = 3.141592653589793
# 基本用法
print(f"{pi:.0f}") # 3
print(f"{pi:.1f}") # 3.1
print(f"{pi:.2f}") # 3.14
print(f"{pi:.4f}") # 3.1416
# 结合宽度
print(f"{pi:8.2f}") # ' 3.14'
print(f"{pi:08.2f}") # '00003.14'
# 科学计数法
print(f"{pi:.2e}") # 3.14e+00
# 百分比
ratio = 0.875
print(f"{ratio:.0%}") # 88%
print(f"{ratio:.1%}") # 87.5%
# 使用变量作为精度(动态精度)
precision = 3
print(f"{pi:.{precision}f}") # 3.142(动态精度)
2. 字符串截断
text = "Hello World"
print(f"{text:.3}") # Hel
print(f"{text:.5}") # Hello
print(f"{text:.8}") # Hello Wo
# 结合对齐
print(f"{text:>10.3}") # ' Hel'
print(f"{text:<10.3}") # 'Hel '
print(f"{text:^10.3}") # ' Hel '
# 动态截断长度
max_len = 5
print(f"{text:.{max_len}}") # Hello
3. 复杂的精度控制
# 货币格式化
price = 123.456
print(f"价格: ¥{price:.2f}") # 价格: ¥123.46
# 带千分位和精度
num = 1234567.891234
print(f"{num:,.2f}") # 1,234,567.89
print(f"{num:_.2f}") # 1_234_567.89
# 正负号 + 精度
print(f"{3.14159:+.2f}") # +3.14
print(f"{-3.14159:+.2f}") # -3.14
# 指数形式
print(f"{0.00012345:.2e}") # 1.23e-04
# 百分比 + 宽度
score = 0.875
print(f"得分: {score:6.1%}") # 得分: 87.5%