圆形和书写,如果条件

时间:2010-05-14 05:55:34

标签: delphi if-statement

我有两个十进制数字。我希望这些数字相同,最多4个小数点,而不是舍入。如果数字不同,我希望第二个数字被第一个替换。如果我应该写条件怎么办?

例如,
1.

num1 = 0.94618976  
num2 = 0.94620239

如果我们将这些数字四舍五入到4位小数,那么我们得到0.9462相同的数字,但我不想舍入这些数字。

2

num1 = 0.94620239  
num2 = 0.94639125  

我发现的一种方法是将两个数字的绝对差异说成diff,然后检查值。我的问题是检查diff

的范围

我正在使用delphi,但你可以用任何语言回答。谢谢你。

6 个答案:

答案 0 :(得分:4)

(假设没有负数,并假设每个标签使用delphi)使用trunc()。

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

与10000的乘法使它成为整数,然后一切都很简单。

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

答案 1 :(得分:2)

有几种可能性 - 因为你没有提供语言,我将概述方法。

您可以使用truncate函数(这与舍入不同),只删除精度较高的数字(因此0.94618976变为0.94610.94620239变成0.9462)。您可以比较截断的结果。

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

如果您使用的是整数,我建议您比较位模式,但是您使用的是浮点数,所以这不是一个选项。

答案 2 :(得分:2)

使用Math单元中的SameValue

if SameValue(num1, num2, 0.000099999999999) and not SameValue(num1, num2) then 
  num2 := num1; // only when different and by less then 0.0001

答案 3 :(得分:0)

类似以下C#代码:

if (Math.Abs(Math.Round(number1, 4) - Math.Round(number2, 4)) < 0.00001)
{
    number2 = number1;
}

答案 4 :(得分:0)

查看Delph MATH单元。你会发现“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;

答案 5 :(得分:0)

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

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)

我没有测试过这么多,但是你可以尝试一下 - 至少它不使用舍入,不转换为其他类型(比如截断时可能发生的情况),而且速度相当快。