代码之家  ›  专栏  ›  技术社区  ›  Himadri

舍入和写入条件

  •  0
  • Himadri  · 技术社区  · 16 年前

    如,
    1.

    num1 = 0.94618976  
    num2 = 0.94620239
    

    num1 = 0.94620239  
    num2 = 0.94639125  
    

    diff 然后检查数值。我的问题是检查 差异 .

    6 回复  |  直到 11 年前
        1
  •  2
  •   Francesca    16 年前

    使用类似 SameValue

    if SameValue(num1, num2, 0.000099999999999) and not SameValue(num1, num2) then 
      num2 := num1; // only when different and by less then 0.0001
    
        2
  •  4
  •   Marco van de Voort    16 年前

    (假设没有负数,并且根据标记假设delphi)使用trunc()。

    trunc(num1*10000.0)=trunc(num2*10000.0)
    

    如果您计算10000.0(例如,使用幂(10,n)),您甚至可以将位数设为运行时变量。

        3
  •  2
  •   Oded    16 年前

    truncate 函数(这与舍入不同),它只是删除精度较高的数字(所以 0.94618976 变成 0.9461 0.94620239 0.9462 ). 您可以比较截断的结果。

    如果您选择的语言不支持直接数字截断,则可以转换为字符串表示形式,只比较前N个字符。

        4
  •  0
  •   to StackOverflow    16 年前

    类似以下C代码:

    if (Math.Abs(Math.Round(number1, 4) - Math.Round(number2, 4)) < 0.00001)
    {
        number2 = number1;
    }
    
        5
  •  0
  •   Brian Frost    16 年前

    看看Delph的数学单元。您将找到“RoundTo”和“SimpleRoundTo”例程。

    type
     TRoundToEXRangeExtended = -20..20;
    
    function RoundTo(const AValue: Extended;
                     const ADigit: TRoundToEXRangeExtended): Extended;
    
    { This variation of the RoundTo function follows the asymmetric arithmetic
      rounding algorithm (if Frac(X) < .5 then return X else return X + 1).  This
      function defaults to rounding to the hundredth's place (cents). }
    
    function SimpleRoundTo(const AValue: Extended; const ADigit: TRoundToRange = -2): Extended;
    
        6
  •  0
  •   PatrickvL    16 年前

    只是一个想法,但是这个怎么样:

    function CheckEqualUpTo4Digits(const aValue1, aValue2: Double): Boolean;
    var
      Diff: Double;
    begin
      Diff := Abs(aValue1 - aValue2);
      Result := (Diff < 0.0001);
    end;
    

    使用此代码,将返回True:

    CheckEqualUpTo4Digits(0.94618976, 0.94620239);
    

    返回False:

    CheckEqualUpTo4Digits(0.94620239 , 0.94639125)
    

    我没有做过太多的测试,但是你可以试一试——至少它没有使用舍入,没有转换到另一种类型(比如截断),而且速度相当快。