VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2459|回复: 12

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

[复制链接]

1

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-3-11 10:30:01 | 显示全部楼层 |阅读模式
var
  a:double;
  s:string;
begin
  a := 8.07;
  s := formatfloat('#.####################',a);
  showmessage(s);
end;

大家猜猜结果是什么:8.07000000000000028

为什么呢?Delphi怎么这么奇怪?
回复

使用道具 举报

1

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-6-3 21:45:01 | 显示全部楼层
为什么后面还多出一个28????

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

使用道具 举报

0

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-6-4 19:15:01 | 显示全部楼层
因为它的类型是Double
回复

使用道具 举报

1

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-6-5 18:45:01 | 显示全部楼层
但是我是直接给它赋值的呀,系统为什么强制加上000000000000028?有什么好的办法解决这个问题?
回复

使用道具 举报

1

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-6-7 12:45:01 | 显示全部楼层
我一旦使用ADOConnection.Open之后
a := 8.07000000000000028;

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

s显示都还是8.07,为什么呢?
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-6-16 17:15:01 | 显示全部楼层
我一旦使用ADOConnection.Open之后
a := 8.07000000000000028;
-----------------------------------------------
a := 8.07000000000000028;与使用ADOConnection.Open有什么关系?楼主没有说.

假设a是从数据表里提取出来的,那请楼主看一下该字段的精度是多少.
回复

使用道具 举报

1

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-6-25 12:30:01 | 显示全部楼层
a := 8.07;
  s := formatfloat('#.####################',a);
  showmessage(s);//显示8.07000000000000028
  ADOConnection.Open
  a := 8.07;
  s := formatfloat('#.####################',a);
  showmessage(s);//显示8.07
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-7-5 02:30:01 | 显示全部楼层
在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的范围。
回复

使用道具 举报

0

主题

34

帖子

21.00

积分

新手上路

Rank: 1

积分
21.00
发表于 2020-7-5 07:00:01 | 显示全部楼层
哦,关于位数,我说的可能是错的。但是使用format()没错。
回复

使用道具 举报

1

主题

8

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
 楼主| 发表于 2020-7-25 14:15:01 | 显示全部楼层
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??????
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表