5+3=7.9999999999999999 DELPHI+SYBASE的问题(100分)

  • 主题发起人 主题发起人 wudw
  • 开始时间 开始时间
W

wudw

Unregistered / Unconfirmed
GUEST, unregistred user!
一个table,两个字段:column1、column2,都是float类型8位,
在db explorer写一个select语句:
select column1,column2,result=column1+column2 FROM tablename
结果如下:
column1 column2 result
5 3 7.9999999999999999

小数位有时特别多,有时用E的方式表示,为什么?
但用isql写是正常:result=8
 
没有这个问题呀(NT4+sybase11.0.1+D4),
说说你的版本及参数设置如Precision等。
 
改成
select column1,column2,CAST(column1+column2 ASDecimal(7,2)) as result
FROM tablename
试试
Sybase没用过不知可不可以用CAST表达式
 
是不是和浮点数的表示方法有关
 
环境:nt4+delphi3/4/5+sybase11.0.1/11.9.2
是否和以下原因有关:
1、此table的数据是用insert语句插入的
2、字段的精度、标度设置(我的精度、标度未设置,都是缺省的)
注:我不想用任何函数(如round)解决此问题,最想知道其产生原因
 
此问题在Sybase 11.9.2的isql中执行却正常,在Sybase 11.9.2中的sql advantage和Delphi5的db explorer中执行不正常.
---------
我在1997年遇到此问题(NT+Delphi2+DB2),在千禧年又遇到了,我要疯了
希望华佗再世,在我有生之年根治顽疾.

 
如果使用浮点型的字段, 就很可能出现这种问题,
因为有些数字永远无法用二进制浮点数精确表示, 如
0.2,0.3 ,精度高, 只是误差小, 如0.3 会表示成
0.29999999... 误差0.0000000....01, 但不可能等于
3. 所以, 在表示货币等需要精确数字的时候, 尽量用
currency, decimal 等类型.


 
最想知道其产生原因?省省吧.因为它是float.就是这个原因.
能不用它就不要用,用 number型.

 
顺变问一句:
一般财务软件中的存放数量、金额的字段用 decimal 比 float 好
 
金额的字段用 decimal 比 float 好.
把问题中的字段设成 整数性就可以了。5+3 也是等于7。9 的循环的(7。9的循环等于8)
一个数学问题。可电脑只能循环有限个。
 
数据库中的实数和DELPHI中的实数都是实数,但是不一样:
数据库中的实数是定点数,所以不会有误差的。
但是DELPHI中的REAL和DOUBLE都是浮点数,有误差的;
举个例子说,在DELPHI中,
I:=1.555
马上看I的值,可能看到的就是1.554999999。
所以,在DELPHI中要处理小数运算,那真是麻烦!
 
用decimal替换float!
顺便告诉你,pb中也有此问题。
 
张国龙、win1998的意见是正确的。
 
我认为这样做可能更简单:
用Ttable或Tquery,把需要的字段的属性DisplyFormat设置为“#0.00”,这样就可
以了,虽然我没有用过sysbase,我看也差不多。
 
将变量的类型和输出格式设置一 下大概就可以了吧。。
我没有试过,但是我以前在用C语言时遇见过。
 
将ENABLE BCD设为TRUE 试一试
 
这问题常见,用ROUND(数字,小数位数)就可解决.
 
Venus的答案对,将ENABLE BCD设为TRUE 试一试。
bde的帮助是这没说的。


 
ENABLE BCD设为TRUE后依然如此,例:

select C1,C2,C3,C1+C2-C3 from TABLE1 结果如下
C1 C2 C3 C1+C2-C3
-37227.6 36994.9 0 -232.69999999997
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部