V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ukipoi
V2EX  ›  问与答

如何解决无限循环小数对结果的影响?

  •  
  •   ukipoi · 3 天前 · 922 次点击
    例如
    A = 33415.305
    B = 29.7
    C = 0.9
    先计算 A 除以 B ,结果再乘以 C ,对最终结果保留 2 位小数。
    假设计算必须分步,并且除法的步骤无法移动到最后一步,有办法得到正确的值吗?
    11 条回复    2025-09-12 07:50:46 +08:00
    re2ikotr
        1
    re2ikotr  
       3 天前
    用分数?
    coverme7
        2
    coverme7  
       3 天前
    帮你问了 ChatGPT:

    解决无限循环小数对结果的影响,特别是在计算中保留特定精度的情况下,最重要的原则是合理处理每一步的四舍五入或截断。对于你所描述的计算,可以采取以下策略:
    保留精度:在每一步的计算中,可以适当的四舍五入或截断结果,以避免无限循环小数对最终结果的影响。这个精度要在每一步计算中统一。
    分步计算的处理:
    第一步: 计算 A 除以 B ,即 33415.305 ÷ 29.7 。这个结果可能是一个无限循环小数(例如,1.125768...)。在这一计算中,可以先保留两位小数,得到 1125.77 ,或者根据需要选择其他精度。
    第二步: 然后将这个结果乘以 C ,即 1125.77 × 0.9 。计算后得到结果是 1013.193 ,再次根据要求保留两位小数,结果为 1013.19 。
    总结:
    原则:在每一步的计算中都要注意精度的控制。因为除法可能带来无限小数,所以你可以选择在每一步四舍五入或截断到所需的小数位数。最常见的做法是:每一步先保留较高精度的值,最终再根据需要保留两位小数。
    算法建议:可以在每一步的计算中应用四舍五入,确保结果不会因为无限循环小数而影响准确性,特别是当计算中涉及到多次操作时。
    在编程语言中,通常会有内置的四舍五入函数,或者你可以通过 decimal 模块(如 Python )来精确控制小数位数,避免普通浮点数的精度问题。
    ukipoi
        3
    ukipoi  
    OP
       3 天前
    @coverme7
    已经问过 GPT 了,但是这个是 0.4 的 4 循环,如论保留多少小数,最终结果都只有 .485 和.4849999 的 9 循环的区别。这会造成最终结果是.48 和.49 的区别,然而 AI 只会让我提高精度。
    ukipoi
        4
    ukipoi  
    OP
       3 天前
    @re2ikotr
    有什么库计算是分数的吗?没有接触过
    newaccount
        5
    newaccount  
       3 天前
    金额问题咨询财务,不然以后审计有的你烦的
    sivacohan
        6
    sivacohan  
    PRO
       3 天前   ❤️ 1
    解决不了:
    物理学的方法就是提高精度。比如最终结果要保留 2 为小数,计算过程中就都保留 3 位或者更多。
    如果是金融问题,除了提高精度之外,最终还好有一个校验过程,比如 100.00 元 3 个人平分,每个人分 33.33 元之后,此时三人加和为 99.99 少了 1 分钱,程序会按照某个规定把这 1 分加上去(这个规定就是合规的一部分),结果是两个人 33.33 ,一个人 33.34
    ejin
        7
    ejin  
       3 天前
    不要离开业务讨论解决办法,最后还是无法满足需求。

    你就问需求方,在没有你编程之前,是如何处理这些差异的,这些差异不只是编程的时候才存在,肯定是一直有这样的误差。

    不要怕误差存在,而是如何处理这些误差。
    elevioux
        8
    elevioux  
       3 天前
    从实际业务去考虑
    yianing
        9
    yianing  
       3 天前
    纯技术解决就是分数计算,golang 有 big.Rat
    angeni
        10
    angeni  
       3 天前
    IEEE754 , 没什么好的解决方法。32 位有个 1e-7 误差
    ahu
        11
    ahu  
       2 天前
    银行家舍入法,了解一下
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1293 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:02 · PVG 01:02 · LAX 10:02 · JFK 13:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.