为何Double类型的数组经赋值后小数位被自动截取(100分)

  • 主题发起人 主题发起人 风雨中
  • 开始时间 开始时间

风雨中

Unregistered / Unconfirmed
GUEST, unregistred user!
最近用OLE在做一个CAD图形的检查程序,发现一个问题:用OleVariant类型从CAD中取出一个坐标数组,是Double类型的,为了取出其中的部分数来处理,又定义了几个Double型变量,将数组的值赋给这几个变量,赋值后发现小数位被截短了,不知什么原因?

OleVariant中的坐标为504576.836107584,3559086.77428871
赋值给Double变量后为504576.83611 ,3559086.7743

是直接赋值而没有进行其它操作,请教了。
 
精度的原因吧
 
我一开始也怀疑过,但问题是它们都是double类型啊,这种赋值我觉得不应该有精度损失啊?就算是有损失也不会损失得这么厉害啊,都快变成单精度数了!
 
我试了一下确实也这样,很奇怪.继续关注中......
procedure TForm1.Button1Click(Sender: TObject);
var
a: OleVariant;
b: Variant;
c: Double;
begin
a:= 504576.836107584; //结果a为504576.8361
b:= 504576.836107584; //结果b为504576.8361
c:= 504576.836107584; //这行没有执行
end;
 
和OleVariant类型有关,double类型直接赋值是没有问题的
 
OleVariant的类型应该没问题,我的问题和djrj所说的还有所不同:
我的是用一个OleVariant来接收一系列坐标对,实际上经查看,在它接收坐标后是正确的,只是因为赋值后就被截掉了:

PtLst:OleVariant;
x,y:Double;
PtLst:=Ent.Coordinates; //在这里的PtLst中是 504576.836107584,3559086.77428871
x := PtLst[J * dim]; y := PtLst[J * dim + 1]; //这里的x、sy就是504576.83611 ,3559086.7743
 
是显示函数的问题吧,我用什么函数显示数据出来的?
 
to Writer:
还真让你说对了,我也刚刚发现这个问题:我不是用函数显示的x、y值,而是在调试程序时用鼠标键放在x、y上显示的值。

刚才又用showmessage(FloatTostr(x1))看了一下,x、y的值没有发生变化,看来是真的是显示问题了?

不过,用Run里的Watch查看也是被截断了的,这还能不准吗?是不是Delphi的bug啊?
 
Run的Watch也截断了,这个也不知算不算BUG了,因为一般很少显示那么多位的嘛~~(不知设置里有没有相关选项??)

还有我一看就知显示函数的问题, 是经验之谈来的哦[:D]
 
好象又让你说对了:

Evaluate/Modify format specifiers:
,Fn Floating point Floating point. Shows n significant digits where n can be from 2 to 18. For example, to display the first four digits of a floating-point value, type ,F4. If n is not specified, the default is 11.

默认是11位的!唉!
 
问题已解决。多谢各位!

To Writer:以后还请多多指教啊!
 

Similar threads

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