我有两个十进制数字。我希望这些数字相同,最多4个小数点,而不是舍入。如果数字不同,我希望第二个数字被第一个替换。如果我应该写条件怎么办?
例如,
1.
num1 = 0.94618976
num2 = 0.94620239
如果我们将这些数字四舍五入到4位小数,那么我们得到0.9462相同的数字,但我不想舍入这些数字。
2
num1 = 0.94620239
num2 = 0.94639125
我发现的一种方法是将两个数字的绝对差异说成diff
,然后检查值。我的问题是检查diff
。
我正在使用delphi,但你可以用任何语言回答。谢谢你。
答案 0 :(得分:4)
(假设没有负数,并假设每个标签使用delphi)使用trunc()。
trunc(num1*10000.0)=trunc(num2*10000.0)
与10000的乘法使它成为整数,然后一切都很简单。
如果计算10000.0(例如,使用幂(10,n)),您甚至可以使运行数变量位数。
答案 1 :(得分:2)
有几种可能性 - 因为你没有提供语言,我将概述方法。
您可以使用truncate函数(这与舍入不同),只删除精度较高的数字(因此0.94618976
变为0.9461
和0.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)
我没有测试过这么多,但是你可以尝试一下 - 至少它不使用舍入,不转换为其他类型(比如截断时可能发生的情况),而且速度相当快。