Office中国论坛/Access中国论坛

标题: 文本型数据转数值型作减数后出现细微差异 [打印本页]

作者: apsfxc1    时间: 2009-9-3 14:39
标题: 文本型数据转数值型作减数后出现细微差异
本帖最后由 apsfxc1 于 2009-9-4 09:16 编辑

2000.11 - Str(2000)=0.1099999999
2000.11 - Val(Str(2000))=0.10999999
2000.11 - CCur(Str(2000))=0.11

第2个用val()后为什么还不是0.11,就因这个差异导致这次所得税少扣1分,应纳税额81.70*0.05=4.085=4.09 却变成81.6999999*0.05=4.084999995=4.08

免征额2000作为一个随时可变数以文本格式放在一张表里,计算所得税时调用,调用时用val()转换为数值,当被减数有小数时如2000.11减文本转数值的2000时,会出现尾数,大家可以试建个窗体放上命令键写上 Msgbox  2000.11 - Val(Str(2000))看看结果
作者: 老人与海    时间: 2009-9-3 15:11
考虑一下是不是数据精度问题引起的,另外,把各数据设为双精度试试看看。
作者: apsfxc1    时间: 2009-9-3 15:16
那2000作为一个随时可变数以文本格式放在一张表里,计算所得税时调用,调用时用val()转换为数值
作者: 老人与海    时间: 2009-9-3 15:23
上传附件!
作者: djt    时间: 2009-9-3 15:27
本帖最后由 djt 于 2009-9-3 15:30 编辑

如果数据类型不设为currency,而是single或者双精度,会出现这个问题,建议类型改为currency,或者用round(钱,2)函数来取2位小数,但是round()函数还有个问题,如果最后一位数字是5的话,不会四舍五入,比如round(4.085,2) VBA的结果是4.08,不是4.09,解决方法是后面多加 0。0000001
作者: Henry D. Sy    时间: 2009-9-3 22:12
请更改标题
作者: apsfxc1    时间: 2009-9-4 09:18
这个标题也许能说清楚一点
作者: apsfxc1    时间: 2009-9-4 09:20
如果数据类型不设为currency,而是single或者双精度,会出现这个问题,建议类型改为currency,或者用round(钱,2)函数来取2位小数,但是round()函数还有个问题,如果最后一位数字是5的话,不会四舍五入,比如round(4.08 ...
djt 发表于 2009-9-3 15:27


用round()是不行的,会出现更大差异,奇进偶不进
作者: koutx    时间: 2009-9-4 10:55
Debug.Print 2000.11 - CCur(2000)




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3