You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅用/和%运算符按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:20:12