Python如何实现浮点数截断保留2位小数且不四舍五入,不足补0
浮点数截断问题解答
1. 你提出的新方案不稳定不可行
- 核心问题在于Python原生float采用二进制存储,绝大多数十进制小数无法被精确表示,比如
31.4实际存储值可能为31.399999999999998,乘1000、取整再做除法的操作会放大精度误差,依然会出现你之前遇到的31.4输出31.39这类异常。 - 方案本身存在逻辑错误:乘1000后除以100再除以10属于冗余操作,无实际意义且容易引入额外误差。
2. 规范实现方式
直接使用decimal模块内置的截断规则即可,不需要自行实现字符串切割、乘除取整逻辑,从根源规避精度问题:
from decimal import Decimal, ROUND_DOWN def truncate_2_places(num): # 若输入为float类型,先转字符串再转Decimal,避免float本身的精度误差带入计算 if isinstance(num, (int, float)): num_dec = Decimal(str(num)) else: num_dec = num # 保留2位小数,直接截断后续位,不触发四舍五入 result = num_dec.quantize(Decimal('0.00'), rounding=ROUND_DOWN) return result # 测试验证 print(truncate_2_places(35.3169)) # 输出 35.31 print(truncate_2_places(31.1)) # 输出 31.10 print(truncate_2_places(31.4)) # 输出 31.40 print(truncate_2_places(31.5)) # 输出 31.50 print(truncate_2_places(30.22)) # 输出 30.22
实现说明
quantize是Decimal模块专门用于小数位数调整的内置方法,准确性和兼容性远高于自定义实现ROUND_DOWN参数指定向零截断规则,完全不会触发四舍五入- 最终返回结果自动补全第二位小数,符合输出格式要求
内容的提问来源于stack exchange,提问作者GH00N
相关产品推荐
相关产品推荐

