发现问题
这问题看似简单,但是我遇到了个很难受的麻烦
我的大概思路如图
基本上就一句话,while循环 f乘以10 和 去取整数(f*10) 当我们循环到 最后一位小数的时候 他们两个一定相等。
程序如下
function getDigits(f: real): Integer;
var
i: Integer;
begin
i := 0;
if f = Int(f) then
begin
;
end
else
while not (f = 0) do
begin
f := f * 10 - int(f * 10);
i := i + 1;
end;
Result := i;
end;
但是运行结果却不是这样的
所以我就用showmessage 一步一步的判断,发现 前3次循环还正常
后面都不在我的安排下走了,我发现他们在某一波相减的时候 f=0.9999999...了,所有我又不让他们相减 ,直接去判断。 神奇的一幕出现了。
如果数的个数不超过5个,则完全可以判断,但是在超过的话虽然计算到了,t=f,但是循环并没有结束,继续f:=f*10,这是为什么呢!!!!!!,(前面的9999估计就是这样来的)。
大胆分析
这个应该是delphiint()的缺陷的,或者是 浮点数存储格式问题。这个问题我展示还未想明白,等哪天想明白再来填坑吧。
换个思路曲线救国
我们可以 判断 小数点在这个数的位置来判断多少位小数,啊哈哈哈,代码如下
function getDigits(f: real): Integer;
var
s:string;
begin
s:=FloatToStr(f);
result:=Length(s)-Pos('.',s);
if Result=Length(s) then
Result:=0;
end;
加油吧 ,打工人