我有2个实数(例如a,b)。有没有办法知道他们的分裂结果是否是自然数? 我试过了
a mod b {to check if the result is 0}
但" mod"对于实数不起作用。 还
a/b-trunc(a/b) {but sometimes the answer isn't 0}
我是初学者,请问,是否有其他办法,请告诉我。
答案 0 :(得分:2)
使用Frac
可能是@Sertac提到的一个想法。但由于二进制浮点并不代表所有实数,因此可能存在分数最终接近于零(或者就此问题而言)的情况。
这是一个简单的例程,可以避免测试接近一个或零:
function IsNaturalNumber( value : Double) : Boolean;
const
epsilon : Double = 1E-12;
begin
IsNaturalNumber := Abs(value - Round(value)) < epsilon;
end;
var
A,B : Double;
begin
A := 3.3;
B := 1.1;
WriteLn(IsNaturalNumber(A/B)); // Writes TRUE
end.
该函数测试值和舍入到最接近整数的值之间的绝对差值是否小于合理限制。
请注意,没有绝对的确定性。这将需要使用十进制浮点算术库。
我将把它留给感兴趣的读者来实现排除自然数范围之外的整数,无论是否所有负数都包括零。
如果要测试的值大于Round()
函数的上限,请使用等效的浮点函数。在Delphi中Math.RoundTo(value,0)
。