数据库中小数运算为什么总有掉尾数的现象(50分)

  • 主题发起人 主题发起人 zf501
  • 开始时间 开始时间
Z

zf501

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库中Float字段,小数运算为什么总有掉尾数的现象
如 123.45 运算时总是 123.4499999......,应该如何解决这个问题。
 
数据库中Float字段也有小数位后几位的,设定一下
 
设置BDE的Enabled BCD为 True,讨论好多次了
 
正常的, 浮点数本来就是不精确表示的, 有个有效位数的问题,
一般的浮点数的精度大概是5~7位有效数字左右, 双精度的可能高些,
也不过是十几位.

用BCD的方式是一个解决问题的方法, 它是将浮点数用BCD码(Binary-Coded decimal)
来表示, 本质上说就象我们手工做加减乘除一样, 是按实际位数来算的, 但缺点就是
速度比较慢, 转过来转过去的.
 
我也碰过,
用的是ADO,
那如何办?
 
我用的数据库是Pdox,将BDE改为BCD为True,也不起作用不知为何保存到表中的仍是1.1999999
 
设计数据库时定义小数位数
 
手動截取不就可以了,
round(100*123.4499999)/100
 
T0:livesource
我的小数位不是故定几位的,手动截取不可以四舍五入。
 
TO:zf501
实在看不下去了, 相信你也知道,这个尾数差非常小,只要你程序要求的精度不是那么
严格(到0.0000000001)的话,都可以用livesource的方法将这个0.0000000001舍掉,只要
你根据所用数据的可能的最小位数,加上一两位取整就是了。如:0.007-0.006=0.000999999999999999
乘上1000000取整再除就是0.001,我想只要不是太高的数学计算,你的东西如不会用到小数
点后6位的。
其它的方法有用设DisplayFormat来解决,只是驼鸟战术,显示的时候没问题,但差值始
终存在,长期积累...,所以应该在对字段付值时按livesource的方法处理它,
还有用FloatToStr,和StrToFloat来处理,原理与liveSource一样,但还是liveSource方
法简单,
 
多人接受答案了。
 
后退
顶部