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

CS50找零项目浮点精度问题优化方案咨询

CS50找零项目:替代浮点精度修正(+0.001)的更优方案

你的核心问题出在浮点数的二进制存储精度缺陷——像0.1、0.05这类十进制小数,在二进制里是无限循环的,存储时会产生微小误差,导致计算时出现类似0.09999999999999998这种本该是0.1的数值,所以你才需要加0.001来修正。但这只是临时hack,更根本的解决方案是彻底抛弃浮点数,用整数表示美分。

优化思路

货币计算的最佳实践是把所有金额转换成最小单位的整数(这里就是美分),用整数运算完全规避浮点误差:

  1. 将用户输入的美元金额乘以100,通过四舍五入转成整数美分
  2. 用整数除法算每种硬币的数量,取余得到剩余金额,全程无浮点运算

优化后的代码

from cs50 import get_float

while True:
    change = get_float("How much change is owed? ")
    if change > 0:
        break

# 转换为整数美分,避免浮点精度问题
cents = round(change * 100)

# 计算每种硬币数量
quarters = cents // 25
cents = cents % 25

dimes = cents // 10
cents = cents % 10

nickels = cents // 5
cents = cents % 5

pennies = cents

total_coins = quarters + dimes + nickels + pennies
print(total_coins)

为什么这个方案更好

  1. 无精度误差:整数运算不存在二进制存储的精度丢失问题,不需要任何额外修正
  2. 逻辑更清晰:直接用//算硬币数量,%取剩余金额,比原来的浮点加减更直观
  3. 符合行业规范:几乎所有涉及货币的系统都会用整数存储最小单位,这是通用的最佳实践

对你原有代码的补充说明

你原来代码里的change = change - (int(q)/4)其实等价于减去int(q)*0.25,但浮点数减法依然会累积误差;而用整数取余cents = cents % 25完全不会有这个问题,计算结果绝对准确。

内容的提问来源于stack exchange,提问作者kenblitzer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:57:25