发现问题

这问题看似简单,但是我遇到了个很难受的麻烦
我的大概思路如图
思路图,字有点丑

基本上就一句话,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;

但是运行结果却不是这样的
image.png

所以我就用showmessage 一步一步的判断,发现 前3次循环还正常
image.png
后面都不在我的安排下走了,我发现他们在某一波相减的时候 f=0.9999999...了,所有我又不让他们相减 ,直接去判断。 神奇的一幕出现了。
image.png
如果数的个数不超过5个,则完全可以判断,但是在超过的话虽然计算到了,t=f,但是循环并没有结束,继续f:=f*10,这是为什么呢!!!!!!,(前面的9999估计就是这样来的)。image.png

大胆分析

这个应该是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;

加油吧 ,打工人

Q.E.D.


努力学习的小菜鸟