如何解决无限循环小数对结果的影响? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ukipoi
V2EX    问与答

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

  •  
  •   ukipoi 80 天前 1490 次点击
    这是一个创建于 80 天前的主题,其中的信息可能已经有所发展或是发生改变。
    例如
    A = 33415.305
    B = 29.7
    C = 0.9
    先计算 A 除以 B ,结果再乘以 C ,对最终结果保留 2 位小数。
    假设计算必须分步,并且除法的步骤无法移动到最后一步,有办法得到正确的值吗?
    12 条回复    2025-11-14 10:00:39 +08:00
    re2ikotr
        1
    re2ikotr  
       80 天前
    用分数?
    coverme7
        2
    coverme7  
       80 天前
    帮你问了 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
       80 天前
    @coverme7
    已经问过 GPT 了,但是这个是 0.4 的 4 循环,如论保留多少小数,最终结果都只有 .485 和.4849999 的 9 循环的区别。这会造成最终结果是.48 和.49 的区别,然而 AI 只会让我提高精度。
    ukipoi
        4
    ukipoi  
    OP
       80 天前
    @re2ikotr
    有什么库计算是分数的吗?没有接触过
    newaccount
        5
    newaccount  
       80 天前
    金额问题咨询财务,不然以后审计有的你烦的
    sivacohan
        6
    sivacohan  
    PRO
       80 天前   1
    解决不了:
    物理学的方法就是提高精度。比如最终结果要保留 2 为小数,计算过程中就都保留 3 位或者更多。
    如果是金融问题,除了提高精度之外,最终还好有一个校验过程,比如 100.00 元 3 个人平分,每个人分 33.33 元之后,此时三人加和为 99.99 少了 1 分钱,程序会按照某个规定把这 1 分加上去(这个规定就是合规的一部分),结果是两个人 33.33 ,一个人 33.34
    ejin
        7
    ejin  
       80 天前
    不要离开业务讨论解决办法,最后还是无法满足需求。

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

    不要怕误差存在,而是如何处理这些误差。
    elevioux
        8
    elevioux  
       80 天前
    从实际业务去考虑
    yianing
        9
    yianing  
       80 天前
    纯技术解决就是分数计算,golang 有 big.Rat
    angeni
        10
    angeni  
       80 天前
    IEEE754 , 没什么好的解决方法。32 位有个 1e-7 误差
    ahu
        11
    ahu  
       80 天前
    银行家舍入法,了解一下
    734695609
        12
    734695609  
       17 天前
    楼主,你这个问题,和我以前遇到的帮别人计算一些物理公式一样,当时遇到一个问题,类似 1/3 ,再*3 。发现丢失的精度太多。

    我的解决方法是先算乘法*,再算除法/。这样只有最后的除法,才会丢失一些精度
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5660 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 40ms UTC 02:57 PVG 10:57 LAX 18:57 JFK 21:57
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86