关于精度简单而又奇怪的问题!!!大家帮忙!

yuhongwei 2007-01-05 02:54:45
var
a:double;
s:string;
begin
a := 8.07;
s := formatfloat('#.####################',a);
showmessage(s);
end;

大家猜猜结果是什么:8.07000000000000028

为什么呢?Delphi怎么这么奇怪?
...全文
276 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuhongwei 2007-01-08
  • 打赏
  • 举报
回复
var
a:double;
s:string;
vADOConnection:Variant;
begin
a := 8.07;
s := formatfloat('#.################',a);//s显示8.07000000000000028
vADOConnection := CreateOleObject('ADODB.Connection');
vADOConnection.ConnectionString := 'Driver={Firebird/InterBase(r) driver};pwd=masterkey;Uid=SYSDBA;database=C:\123.GDB';
try
vADOConnection.Open;
Except
end;
a := 8.07;
s := formatfloat('#.################',a);//s显示8.07
end;


以上如何实现上下都是8.07000000000000028??????
yuhongwei 2007-01-08
  • 打赏
  • 举报
回复
谢谢dBASEIII(明年毕业了) ,可是如果我希望
var
a:double;
s:string;
vADOConnection:Variant;
begin
a := 8.07;
s := formatfloat('#.################',a);//s显示8.07000000000000028
vADOConnection := CreateOleObject('ADODB.Connection');
vADOConnection.ConnectionString := 'Driver={Firebird/InterBase(r) driver};pwd=masterkey;Uid=SYSDBA;database=C:\123.GDB';
try
vADOConnection.Open;
Except
end;
a := 8.07;
s := formatfloat('#.################',a);//s显示8.07
end;

显示8.07的地方也显示8.07000000000000028,意思就是即使错也错的一样!

我个人理解,vADOConnection.Open调用了MS的库文件,所以有效位数之后的数字直接删除了。有什么好方法来不删除呢?
dBASEIII 2007-01-08
  • 打赏
  • 举报
回复
我的知识不够专业,因此只能说估计:

我估计是因为你的#的个数超出了实数的精度范围而致。其实,我估计,8.07显示为8.000000000000028这样,本身就是一个错误。请看一下我在上面的回复。正确的结果应该是显示为8.07或8.070000000000000这样

然后你再按我的代码,把var a : double;换成var a : Extended;试试,是不是可以加很多的#

yuhongwei 2007-01-08
  • 打赏
  • 举报
回复
如何实现s始终显示8.07000000000000028??????
dBASEIII 2007-01-05
  • 打赏
  • 举报
回复
哦,关于位数,我说的可能是错的。但是使用format()没错。
dBASEIII 2007-01-05
  • 打赏
  • 举报
回复
在32位Windows系统里:

Double类型:表示范围:±5.0 * 10^-324 ~ 1.7 * 10^308  有效位:15~16位。所以,把你的formatFloat这样改一下,试试:
var
a : double;
s:string;
begin
a := 8.07;
s := formatfloat('#.##############',a);//注意,小数点后15个#
edit1.text := s ;//显示8.07

s := format('%1.15f',[a]);
edit2.text := s ; //显示8.070000000000000  建议用format()
end;

使用format()转换,既使你发现的adoconnection问题,也不复存在了。
你的问题,首先是你的精度超出了double的范围。
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
估计大家都回家了,这个问题只能等到明天吗?
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
大家说这事奇怪不奇怪!?
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
a := 8.07;
s := formatfloat('#.####################',a);
showmessage(s);//显示8.07000000000000028
ADOConnection.Open
a := 8.07;
s := formatfloat('#.####################',a);
showmessage(s);//显示8.07
dBASEIII 2007-01-05
  • 打赏
  • 举报
回复
我一旦使用ADOConnection.Open之后
a := 8.07000000000000028;
-----------------------------------------------
a := 8.07000000000000028;与使用ADOConnection.Open有什么关系?楼主没有说.

假设a是从数据表里提取出来的,那请楼主看一下该字段的精度是多少.
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
这么难的问题难道大家都不会吗?
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
我一旦使用ADOConnection.Open之后
a := 8.07000000000000028;

s := formatfloat('#.####################',a);

s显示都还是8.07,为什么呢?
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
但是我是直接给它赋值的呀,系统为什么强制加上000000000000028?有什么好的办法解决这个问题?
踢踏 2007-01-05
  • 打赏
  • 举报
回复
因为它的类型是Double
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
我使用的是Delphi6.0
yuhongwei 2007-01-05
  • 打赏
  • 举报
回复
为什么后面还多出一个28????

好像任何环境下都是这个,还比较固定的一个数字

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧