procedure TForm1.Button1Click(Sender: TObject);
var f:real ;
begin
f:=14.85 ;
showmessage(inttostr(trunc(f*10+0.5))) ; //结果: 148
showmessage(inttostr(trunc(14.85*10+0.5))) ; //结果: 149
end;为什么结果不一样呢?好奇怪!
var f:real ;
begin
f:=14.85 ;
showmessage(inttostr(trunc(f*10+0.5))) ; //结果: 148
showmessage(inttostr(trunc(14.85*10+0.5))) ; //结果: 149
end;为什么结果不一样呢?好奇怪!
解决方案 »
- 大家帮助我真的很急.................
- ●●●●为了自己方便,也为大家方便,建立了一个DELPHI程序员QQ群:8194759●●●●
- 我的毕业设计题目~~~ 无语!~~~ 进来看看随便出出点子
- DBGrid能不能实现这个?
- 如何捕获DLL中的异常
- 我做一个程序是用做发邮件的,没有带验证的,每次发邮件的时候都要输入密码之类的东西,有点烦有没有什么方法去掉呀(我是用DELPHI与的)
- DELPHI中如何使用REC文件?(无内容)
- 为什么控件在设计期的效果与运行期的效果不同请帮帮我!!代码如下
- 我在COM1上接了一个小键盘,我想把在小键盘上按的每一键都记录到一个文本文件中,该怎么做?
- 熟悉IE浏览器在注册表中设置的大侠请进!!!!!!
- 寻找译本好书
- 如何调出oracle一个用户下的所有数据表?
14.85*10 = float數據類型不同, 我估計是這樣的
更多的我就不知了
建议如有可能的话多用ROUND
var
e:Extended ;
r:real;
s:single;
begin
s:=14.85 ;
r:=14.85 ;
e:=14.85 ;
showmessage(inttostr(trunc(s*10+0.5))) ; //结果: 149
showmessage(inttostr(trunc(r*10+0.5))) ; //结果: 148
showmessage(inttostr(trunc(e*10+0.5))) ; //结果: 149
showmessage(inttostr(trunc(14.85*10+0.5))) ; //结果: 149
end;
我同事有时好象用floor和ceil也有一些问题
var f:real ;
begin
f:=14.85 ;
showmessage(floattostr(frac(f*10))) ; //结果是0.499999999999996 而不是0.5
end;这样一来,岂不是大家的四舍五入的函数就不很精确了?比如输入14.85,要求精确到角,就会出问题?!
我以前也遇见过类似的问题,判断浮点数是否相等,直接用A=B是有问题的,后来一直这样判断:
if Abs(A - B) < 0.000001 then
...四舍五入最邪门的我记得有一个数字:16.025,Round后总给我舍成16.02,后来没办法,自己来处理的
http://www.ddvip.net/program/c++/base/94.htm
我分析时用的过程:
var
e,e1:Extended ;
r,r2:real; //real = double
s:single;
begin
s:=14.85 ;
// s:=34.526 ;
r:=14.85 ;
e:=14.85 ;
r2:= r*10+0.5;
e1:= r*10+0.5; //trunc(e1)后变为148
//此时从CPU窗口看到实际的8个字节是00 FF FF FF FF FF FF 94
showmessage(inttostr(trunc(e1))) ; //结果: 与前面的赋值方式有关
//showmessage(floattostr(e1));
e1:= 149; //trunc(e1)后变为149
//此时从CPU窗口看到实际的8个字节是00 00 00 00 00 00 00 95
showmessage(inttostr(trunc(e1))) ; //结果: 与前面的赋值方式有关
showmessage(inttostr(trunc(r2))) ; //结果: 149
showmessage('变量r:real的字节数: ' + inttostr(Sizeof(r))) ; //结果: 8
showmessage(inttostr(trunc(s*10+0.5))) ; //结果: 149
showmessage(inttostr(trunc(r*10+0.5))) ; //结果: 148 //这一行的REAL转换不知为什么不能编译
//showmessage(inttostr(trunc(Real(r*10+0.5)))) ; //结果:
showmessage(inttostr(trunc(e*10+0.5))) ; //结果: 149
showmessage(inttostr(trunc(14.85*10+0.5))) ; //结果: 149
end;
感觉好像是在DELPHI中做浮点运算时,一开始会默认把数转为更精确的EXTENDED类型进行运算,这就解释了两点:
一,trunc(14.85*10+0.5)一开始就把数转换成了高精度的Extended类型计算(如选Optimization编译时大概是编译时就已经算出最后值149写到EXE文件中去的,不过我分别在Optimization选与不选两种状态上测试过上过程,弹出的消息框中看到的结果都是一样的),所以计算准确.
trunc(r*10+0.5)中由于指明是real类型所以不同
二,我那一句//showmessage(inttostr(trunc(Real(r*10+0.5)))) ; //结果:
不能编译是因为r*10+0.5的结果是高精度的Extended类型的,不能向低精度类型强行转换,
我改成showmessage(inttostr(trunc(Extended(r*10+0.5))))后是可以编译的