如何仅用/和%运算符按3、2、1位小数打印1349.9431?
解决浮点数精度问题,纯用除法/取模格式化小数
这个问题我之前也碰到过,核心原因是浮点数的二进制精度限制——像0.9431这类十进制小数没法在二进制中精确存储,直接对原浮点数做除法、取模运算时,就会出现类似13499.430999999999的精度误差。
解决思路是先把浮点数转成精确整数规避精度损失,再用除法和取模拆分出需要的整数部分和小数部分,具体步骤如下:
步骤1:将原数转为精确整数
因为原数有4位小数,我们先把它放大10000倍,同时加0.5修正浮点数的精度偏移,再转成整数(确保得到精确的13499431):
original_num = 1349.9431 scaled_num = int(original_num * 10000 + 0.5) # 得到精确整数13499431
步骤2:按不同小数位数格式化
保留3位小数
通过取模得到后4位小数部分,再去掉最后一位(用取模%10),最后用除法转成3位小数:
# 计算整数部分:用总整数减去后4位,再除以10000 integer_part = (scaled_num - (scaled_num % 10000)) / 10000 # 计算3位小数部分:取后4位,去掉最后一位,再除以1000 decimal_part_3 = ((scaled_num % 10000) - (scaled_num % 10)) / 1000 # 组合结果 formatted_3 = integer_part + decimal_part_3 print(formatted_3) # 输出1349.943
保留2位小数
同理,取后4位小数部分,去掉最后两位(用取模%100),再转成2位小数:
decimal_part_2 = ((scaled_num % 10000) - (scaled_num % 100)) / 100 formatted_2 = integer_part + decimal_part_2 print(formatted_2) # 输出1349.94
保留1位小数
取后4位小数部分,去掉最后三位(用取模%1000),转成1位小数:
decimal_part_1 = ((scaled_num % 10000) - (scaled_num % 1000)) / 10 formatted_1 = integer_part + decimal_part_1 print(formatted_1) # 输出1349.9
为什么这个方法有效?
整数运算不存在二进制精度损失问题,我们先把浮点数转成精确整数后,所有的除法和取模操作都是在整数层面进行的,完全规避了原浮点数的精度误差,最终得到的结果就是我们想要的精确格式化值。
内容的提问来源于stack exchange,提问作者zeeks
相关产品推荐
相关产品推荐

