Python如何正确打印数字小数部分 解决浮点舍入精度异常问题
问题本质
你遇到的精度偏差是二进制浮点数的固有特性:Python默认的float类型是双精度二进制浮点数,无法精确存储0.34这类十进制有限小数,内存中存储的是10.34的近似值,直接做n - int(n)的数值运算,自然会得到带误差的结果,这不是代码逻辑错误,是底层存储机制决定的。
仅用Python自带基础工具的实现方案
以下方案均不需要安装任何第三方库,完全符合基础工具要求:
方案1:直接拆分原始输入字符串(零精度损失,最适配输入场景)
input()函数读取到的内容本身就是字符串格式,不需要提前转成float,直接按小数点拆分就能拿到精确的小数部分:raw_num = input().strip() if '.' in raw_num: _, dec_part = raw_num.split('.', 1) fractional = float(f'0.{dec_part}') else: fractional = 0.0 print(fractional)输入10.34时,这段代码会直接输出0.34。
方案2:用标准库
decimal做精确十进制运算(适合后续还要做小数计算的场景)decimal是Python自带的标准库,专门用于精确十进制运算,不会出现二进制浮点的精度问题:from decimal import Decimal n = Decimal(input().strip()) fractional = n - int(n) print(fractional)这个方案不仅能正确取出小数部分,后续对小数做加减乘除也不会出现类似0.33999999999999986的误差。
方案3:浮点结果按精度四舍五入(仅适合提前明确小数位数的场景)
如果你必须全程使用float类型运算,可以根据业务需要的小数位数对结果做round截断:n = float(input()) # 这里的2代表保留2位小数,可根据实际需求调整 fractional = round(n - int(n), 2) print(fractional)注意这个方案存在边界精度风险,仅适合对精度要求不极端、且明确知道小数位数的场景。
注意:不存在任何二进制浮点数运算技巧能彻底规避这类误差,只要你把十进制小数转成float存储,值本身就是近似的,运算出偏差是必然结果。
内容的提问来源于stack exchange,提问作者user19541980
相关产品推荐
相关产品推荐

