引言
日常写 python 代码时,保留小数是高频需求 —— 比如电商系统显示订单金额(保留 2 位)、数据分析展示百分比(保留 1 位)、实验报告输出测量结果(保留 3 位)。很多新手只会用round()函数,却不知道它有 “坑”,也不清楚不同场景该选哪种方法。
今天就给大家整理 6 种 python 保留小数的常用方法,从基础到进阶,代码示例可直接复制运行,每个方法都讲清 “怎么用、适用场景、注意事项”,新手也能秒懂!
一、先看核心需求:保留小数要解决什么问题?
举个直观例子:计算10/3得到3.3333333333333335,但我们需要:
- 显示金额:
3.33(保留 2 位); - 显示百分比:
3.3(保留 1 位); - 金融计算:高精度的
3.3333333333(避免精度丢失)。
不同场景对应不同方法,下面逐个拆解。
二、6 种保留小数的方法(附代码 + 解析)
方法 1:round () 函数(最基础,内置函数)
round()是 python 内置函数,语法简单:round(数字, 保留位数),核心是四舍五入,适合快速保留小数。
代码示例
# 基础用法
num = 10 / 3
print(f"原始值:{num}") # 输出:3.3333333333333335
# 保留2位小数
print(f"保留2位:{round(num, 2)}") # 输出:3.33
# 保留1位小数
print(f"保留1位:{round(num, 1)}") # 输出:3.3
# 不指定位数,默认保留0位(取整)
print(f"保留0位:{round(num)}") # 输出:3
# 特殊情况:四舍五入的“坑”(不是纯数学的四舍五入)
print(round(2.675, 2)) # 预期2.68,实际输出2.67(浮点数精度问题)
核心解析
- 优点:内置函数,无需导入模块,代码最短;
- 缺点:
- 浮点数精度问题导致结果不符合预期(如
2.675保留 2 位得到2.67); - 适合 “快速粗略保留”,不适合金融、金额等高精度场景;
- 浮点数精度问题导致结果不符合预期(如
- 适用场景:简单的日常计算、非高精度的结果展示。
方法 2:字符串格式化(% 占位符)
用%_.xf的格式(x 为保留位数),本质是格式化输出,不改变数字本身,适合 “展示结果”。
代码示例
num = 10 / 3
print(f"原始值:{num}") # 3.3333333333333335
# 保留2位小数(%_.2f)
print("保留2位:%.2f" % num) # 输出:3.33
# 保留3位小数(%_.3f)
print("保留3位:%.3f" % num) # 输出:3.333
# 补零:比如1.5保留2位,自动补0
print("补零示例:%.2f" % 1.5) # 输出:1.50
核心解析
- 优点:格式化输出,自动补零,适合打印 / 展示结果;
- 缺点:返回的是字符串,不是数字(无法继续计算);
- 适用场景:终端输出、日志记录、报表展示(只看结果,不计算)。
方法 3:format () 函数(推荐,灵活)
format()是 python 官方推荐的格式化函数,语法:format(数字, '.xf'),比%占位符更灵活,支持更多格式。
代码示例
num = 10 / 3
# 基础用法:保留2位
print("保留2位:{}".format(format(num, '.2f'))) # 输出:3.33
# 简写形式(更常用)
print("保留2位(简写):{:.2f}".format(num)) # 输出:3.33
# 保留1位+补零
print("保留1位+补零:{:.1f}".format(1.5)) # 输出:1.5
# 结合其他格式(比如加千分位)
print("加千分位+保留2位:{:,.2f}".format(12345.6789)) # 输出:12,345.68
核心解析
- 优点:灵活,支持补零、千分位、对齐等,返回字符串但格式可控;
- 缺点:返回字符串,需转数字才能计算;
- 适用场景:复杂的结果展示(如带单位、千分位)、报表生成。
方法 4:f-string(python3.6+,最简洁)
f-string 是 python3.6 新增的格式化方式,语法:f"{数字:.xf}",兼顾简洁和灵活,是日常开发的 “首选”。
代码示例
num = 10 / 3
# 保留2位小数
print(f"保留2位:{num:.2f}") # 输出:3.33
# 保留3位小数
print(f"保留3位:{num:.3f}") # 输出:3.333
# 保留1位+补零
print(f"保留1位+补零:{1.5:.1f}") # 输出:1.5
# 结合变量(动态指定保留位数)
n = 2
print(f"动态保留{n}位:{num:.{n}f}") # 输出:3.33
核心解析
- 优点:语法最简洁,支持动态指定保留位数,可读性最高;
- 缺点:返回字符串,python3.6 以下版本不支持;
- 适用场景:python3.6 + 的所有展示场景(日常开发首选)。
方法 5:decimal 模块(高精度,适合金融 / 金额)
前面的方法都有浮点数精度问题,而decimal模块专门解决 “高精度小数计算”,适合金融、金额等对精度要求高的场景。
代码示例
from decimal import decimal, round_half_up
# 解决round(2.675, 2)的精度问题
num = decimal('2.675') # 注意:用字符串初始化,避免浮点数精度丢失
# 保留2位小数,四舍五入
res = num.quantize(decimal('0.00'), rounding=round_half_up)
print(f"高精度保留2位:{res}") # 输出:2.68
# 对10/3进行高精度保留
num2 = decimal('10') / decimal('3')
res2 = num2.quantize(decimal('0.0000')) # 保留4位
print(f"10/3保留4位:{res2}") # 输出:3.3333
核心解析
- 优点:高精度,完全符合数学上的四舍五入,无精度丢失;
- 缺点:需要导入模块,语法稍复杂;
- 适用场景:金融计算、金额结算、税 务计算(高精度要求)。
方法 6:numpy.round(大数据 / 数组场景)
如果处理的是 numpy 数组(数据分析、机器学习常用),用numpy.round()更高效,支持对整个数组保留小数。
代码示例
import numpy as np
# 生成numpy数组
arr = np.array([10/3, 2.675, 1.5])
print(f"原始数组:{arr}") # 输出:[3.33333333 2.675 1.5 ]
# 对整个数组保留2位小数
arr_round = np.round(arr, 2)
print(f"保留2位后的数组:{arr_round}") # 输出:[3.33 2.68 1.5 ]
核心解析
- 优点:专为 numpy 数组设计,批量处理效率高;
- 缺点:需要安装 numpy 库(
pip install numpy); - 适用场景:数据分析、机器学习(处理大量数值数组)。
三、新手必避坑指南(重点!)
坑 1:浮点数本身的精度问题
# 看似2.675,实际存储的是近似值 print(2.675) # 输出:2.6749999999999998
这就是round(2.675, 2)得到2.67的原因 —— 浮点数在计算机中是二进制存储,部分十进制小数无法精确表示。
坑 2:round () 的 “四舍六入五成双”
python 的round()不是纯数学的四舍五入,而是 “四舍六入五成双”(银行家舍入):
- 当保留位后一位是 5,且后面无数字时,保留位为偶数则舍去,奇数则进 1;
- 示例:
round(1.5)=2,round(2.5)=2(5 后面无数字,保留位 0 是偶数,舍去)。
坑 3:字符串格式返回的是字符串,不是数字
res = "%.2f" % 10/3 # 错误:字符串不能直接除法
# 正确做法:转成浮点数
res = float("%.2f" % (10/3))
print(res + 1) # 输出:4.33
四、不同场景该选哪种方法?(总结表)
| 方法 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| round() | 内置函数,简洁 | 精度问题、四舍五入坑 | 简单计算、非高精度展示 |
| % 占位符 | 自动补零,适合展示 | 返回字符串 | 终端输出、简单报表 |
| format() | 灵活,支持多格式 | 返回字符串 | 复杂展示(千分位、对齐) |
| f-string | 最简洁,支持动态位数 | python3.6+、返回字符串 | python3.6 + 的日常展示(首选) |
| decimal 模块 | 高精度,无精度丢失 | 语法稍复杂 | 金融、金额、高精度计算 |
| numpy.round | 批量处理数组高效 | 需安装 numpy | 数据分析、机器学习(数组处理) |
五、总结(新手速记)
- 日常展示(python3.6+):优先用
f-string({num:.2f}),简洁又灵活; - 高精度计算(金融 / 金额):用
decimal模块,避免精度丢失; - numpy 数组处理:用
numpy.round(); - 简单粗略保留:用
round(),但注意它的四舍五入规则; - 所有字符串格式方法:如需计算,记得用
float()转成数字。
建议大家把文中的代码逐个运行一遍,改改保留位数、换几个数字,就能快速掌握不同方法的差异。保留小数看似简单,选对方法能避免很多隐藏问题,尤其是金融场景,千万别只用round()哦!
以上就是python保留小数的6种常用方法的详细内容,更多关于python保留小数方法的资料请关注代码网其它相关文章!
发表评论