Access中小数字段的使用问题,急用!(100分)

  • 主题发起人 主题发起人 孤独的鱼
  • 开始时间 开始时间

孤独的鱼

Unregistered / Unconfirmed
GUEST, unregistred user!
最近编写一个工资计算方面的小程序,Delphi5.0+ADO+Acess,表结构(示例):
  工资1 工资2 工资3 应发工资
要求:工资1、工资2、工资3必须是2位小数,应发工资=工资1+工资2+工资3

我认为字段设为货币型不合适(4位小数),便使用了小数类型字段(2位小数),结果
发现以下问题:
  1、用计算后的数值去update工资1时,多于2位的小数部分被截断,而不四舍五入;
  2、round函数不能用于四舍五入;
  3、小数计算时有误差。

  大家看一看,该怎么解决?
  
 
对于进而类型还是用Currency类型吧,无论哪种数据库都对金额类型有特殊的处理,对于
小数可就按照一般数值进行运算了.
 
可以用round来结合取数:
V_gz1:=Round(Dataset1.fieldbyname('f_Gz1').asFloat*100)/100;
//先乘以100后取整,再除以100,得出的数会刚好保留2位小数并已四舍五入
V_gz2:=Round(Dataset1.fieldbyname('f_Gz2').asFloat*100)/100;
V_gz3:=Round(Dataset1.fieldbyname('f_Gz3').asFloat*100)/100;
V_Yfgz:=V_Gz1+V_Gz2+V_Gz3;
 
系统中要求每一工资项都保留到分:
用Currency类型不合适,比如:
工资1=10.1111 
工资2=10.3131
 工资3=10.1111
计算 应发工资=30.5353,再四舍五入:30.54
而用小数:
工资1=10.11
工资2=10.31
 工资3=10.11
计算 应发工资=30.53
 
应该是各工资先保留2位小数,再进行应发工资的累计计算,结果理应是30.53。
 
猎手1号,你的意思字段还是设为货币类型?只是计算时多加注意?
 
不要设为货币类型,直接用实数型就可以了。
 
不象 Foxpro ,Access 中是无法定义小数的位数的。
浮点类型只能为 单精度或双精度。
 
猎手1号,如果设为实数型,麻烦很多,比如:每次显示工资1、工资2时要转为2位小数,
每次计算应发工资也要将工资1、工资2时转为2位小数后累加,麻烦太多了!

jsxjd,Access是可以定义小数位数的,你再试试?
 
哪有roundto函数?
 
你把字段的小数位数改为4位或者更多,在显示的时候只显示两位就可以了!
修改ADODataSet的FormatLable属性#,##0.00
 
取小数点的时候一定要记得在运算过程中不能进行四舍五入,另外字段的类型也有讲究,计算得出结果
后才能进行精确。ok
 
misxjq,你的方法在报表形成后,帐目是不平的(应发工资<>工资1+工资2+工资3);
 
Access中设置实数的小数位数是没有用的。
 
试一下formatfloat这个函数,用法如下:
edit1.text:=formatfloat('0.00',Dataset1.fieldbyname('f_Gz3').asFloat);
 
无论是两位小数还是四位小数,小数的位数应该前后统一。建议使用四位小数,准确。
在实际发工资时,有财务人员掌握发多少。这样账目上就不会出现问题了。
 
我又试了一下,用货币型时,如果设定小数位为2位,只要录入和保存时注意只保留2位
小数的话,它显示与计算时就不会超过2位小数。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
S
回复
0
查看
738
SUNSTONE的Delphi笔记
S
D
回复
0
查看
834
DelphiTeacher的专栏
D
后退
顶部