E EdwinYeah Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #1 我用了frac, int, floor等函数还是不行,请帮忙!
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #2 var fouble=0.025; procedure TForm1.Button1Click(Sender: TObject); var n:Integer; begin f:=f*10; n:=floor(f); if n=f then ShowMessage('OK!'); end;
var fouble=0.025; procedure TForm1.Button1Click(Sender: TObject); var n:Integer; begin f:=f*10; n:=floor(f); if n=f then ShowMessage('OK!'); end;
V VGA Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #3 f := 0.25; repeat f := f *10; until f = trunc(f);
Z zcy Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #4 f = 0.0025 while f-int(f) <> 0 do f:=f*10;
E EdwinYeah Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #5 如果直接赋值 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就应结束了 其它语言也会有这种情况,如何解决?
如果直接赋值 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就应结束了 其它语言也会有这种情况,如何解决?
C creation-zy Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #6 我用的可是Double,你试一试我的程序,就算f=1.0025-1;也没有任何问题。 只要小数的位数不至于长得太离谱,都没问题。如果实在太长的话... 有一个笨办法:一开始就将f转化为String: FStr=FloatToStr(f); 然后找一下小数点之后有几位就可以了(当然,代指数的要另行处理),办法虽然笨,可是绝对有效!
我用的可是Double,你试一试我的程序,就算f=1.0025-1;也没有任何问题。 只要小数的位数不至于长得太离谱,都没问题。如果实在太长的话... 有一个笨办法:一开始就将f转化为String: FStr=FloatToStr(f); 然后找一下小数点之后有几位就可以了(当然,代指数的要另行处理),办法虽然笨,可是绝对有效!
E EdwinYeah Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #7 to creation-zy: 其实我是写一个将小数转换成分数的函数,原先我接受real型参数, 现改成接受 string型参数,一切OK!所想与你可谓异曲同工也,所有分就给你多一点吧.
M moon_qiu Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-18 #8 f:=0.025; d=25 repeat f:=f*10; until f=d;
Z zcy Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-19 #9 To EdwinYeah 我按照f = 1.0025 - 1这样做了一下,还是可以的。 没有发现EdwinYeah所说的情况,难道与我用的VERION有 关吗?我用的是D5
Z zlxym Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-19 #10 这种问题最好转成字符串运算,控制小数点的移动。如果在字符串中小数点已经在最后一位 ,就达到了目的。 因为小数在计算机里是不能精确表示的,总是有一点误差。
E EdwinYeah Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-19 #11 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;
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;
G guying Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-19 #12 取整后判断是否相等 for if round(i*10)=i+10 then ....... else i:=i*10
L Lera Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-20 #13 当在字符串来处理是最好的办法了 只要你的小数是有效的.
B beta Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-20 #14 考虑精度问题,可以用两数差的绝对值足够小来判断两个数相等:(数学思想) 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;
B beta Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-20 #15 考虑精度问题,可以用两数差的绝对值足够小来判断两个数相等:(数学思想) 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;
Z zcy Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-20 #18 To EdwinYeah ,试过了果然不行。 我想可能采用按字符串处理的方法可能更好。
E EdwinYeah Unregistered / Unconfirmed GUEST, unregistred user! 2001-05-20 #19 奇怪!我昨天不是已经给分吗?系统还说已接受!