一个小数,如0.025,不断乘10,,如何判断已变成整数???(50分)

  • 主题发起人 主题发起人 EdwinYeah
  • 开始时间 开始时间
E

EdwinYeah

Unregistered / Unconfirmed
GUEST, unregistred user!
我用了frac, int, floor等函数还是不行,请帮忙!
 
var
f:Double=0.025;
procedure TForm1.Button1Click(Sender: TObject);
var
n:Integer;
begin
f:=f*10;
n:=floor(f);
if n=f then
ShowMessage('OK!');
end;
 
f := 0.25;
repeat
f := f *10;
until f = trunc(f);

 
f = 0.0025

while f-int(f) <> 0 do
f:=f*10;
 
如果直接赋值
f = 0.0025

creation-zy的floor,VGA的Trunc及zcy的int都行得通,但如果这样
f = 1.0025 - 1

就是因为精度问题无法判断,1.0025 - 1 会等于 0.00249999999...
一直乘10就会 2.4999、24.999、249.999,而其它等于25就应结束了
其它语言也会有这种情况,如何解决?

 
我用的可是Double,你试一试我的程序,就算f=1.0025-1;也没有任何问题。
只要小数的位数不至于长得太离谱,都没问题。如果实在太长的话...

有一个笨办法:一开始就将f转化为String: FStr=FloatToStr(f);
然后找一下小数点之后有几位就可以了(当然,代指数的要另行处理),办法虽然笨,可是绝对有效!
 
to creation-zy:
其实我是写一个将小数转换成分数的函数,原先我接受real型参数, 现改成接受
string型参数,一切OK!所想与你可谓异曲同工也,所有分就给你多一点吧.
 
f:=0.025;
d=25
repeat
f:=f*10;
until f=d;
 
To EdwinYeah
我按照f = 1.0025 - 1这样做了一下,还是可以的。
没有发现EdwinYeah所说的情况,难道与我用的VERION有
关吗?我用的是D5
 
这种问题最好转成字符串运算,控制小数点的移动。如果在字符串中小数点已经在最后一位
,就达到了目的。
因为小数在计算机里是不能精确表示的,总是有一点误差。
 
to zcy:
请你运行一下下面这段程序

procedure TfrmMain.Button2Click(Sender: TObject);
var
f: Double;
begin
f := 1.0025;
f := f - Int(f)

while f-int(f) <> 0 do
f := f * 10;
ShowMessage('value of f is now: ' + FloatToStr(f));
end;

 
取整后判断是否相等
for
if round(i*10)=i+10 then .......
else i:=i*10
 
当在字符串来处理是最好的办法了
只要你的小数是有效的.
 
考虑精度问题,可以用两数差的绝对值足够小来判断两个数相等:(数学思想)

var
i, n: integer;
f, j: double;
begin
n := 10;
f := 0.1;
j := 0.0000000001
//精度控制
while abs(n - f) > j do
f := f * 10;
end;
 
考虑精度问题,可以用两数差的绝对值足够小来判断两个数相等:(数学思想)

var
i, n: integer;
f, j: double;
begin
n := 10;
f := 0.1;
j := 0.0000000001
//精度控制
while abs(n - f) > j do
f := f * 10;
end;
 
sorry, 一不小心发了两次 :-p
 
beta所言极是
 
To EdwinYeah ,试过了果然不行。
我想可能采用按字符串处理的方法可能更好。
 
奇怪!我昨天不是已经给分吗?系统还说已接受!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部