先说明数据库为sql server ,allcharge 为float型,RsTT!allcharge的值为119.935
Ac = Int((RsTT!allcharge) * 100 + 0.5) / 100 四舍五入
Debug.Print Ac
结果为: 119.93
真的呀? 我试了试怎么 是 119.94 呀?
119.935 * 100 =11993.5
11993.5 + 0.5 = 11994
int(11994) =11994
11994/100 =119.94
你说是它等于什么?
Round函数
描述
返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果。
语法
Round(expression [,numdecimalplaces])
Round函数语法有如下几部分:
部分 描述
expression 必需的。要进行四舍五入运算的数值表达式。
numdecimalplaces 可选的。数字值,表示进行四舍五入运算时,小数点右边应保留的位
数。如果忽略,则Round函数返回整数。
对不起,我没看清楚你的问题!抱歉!
我也试了,结果如楼主所说,真有点想不通
幅点是这样的。。。
我试了一下,应该这么解释:
在
Ac = Int((RsTT!allcharge) * 100 + 0.5) / 100 四舍五入
Debug.Print Ac
中,RsTT!allcharge的数据类型如楼主所说是float型,
当它在vb自动中会转换为vb中的Single 类型,这样得到的 Ac 就是 119.93了,
如果使得转换成 Double 型,Ac 就是 119.94了。
这个问题应该时vb对于数据类型的默认转换造成的。
主要是浮点问题造成的,因为计算机是以二进制方式运算的,
所以float型存储的值是近似值,不要认为是加法和乘法就不会有那种近似值出现
要知道计算机是二进制运算的。
其他的呢,xo2000(平凡人生) 都说了,我也就不罗嗦了
pinelee(我心依旧) 说的对,不用大惊小怪的,以前有个这样的帖子,很详细的。
Ac =format(RsTT!allcharge,"standard")
Debug.Print Ac
计算机中浮点数是离散分布的。所以绝大多数的数只能以一个接近它的数来表示,接近的程度依赖于数的精度。例如 0.1就可能表示为 0.0999999999... 或 0.1000000001... 由于存在精度上的误差就出现你说讲到的现象。8.28725321453883 和 8.28725321453882 在计算机中的表示可能存在误差,所以结果存在误差就不奇怪了。8.2872 - 8.2871 =0.0001 和 9.99999999997669E-05 只相差 0.0000000000000002331 已经很精确了。
用浮点就是这样!
由于上述原因,一般在比较浮点数一般不使用等号。也就是说,不使用8.2872 - 8.2871 =0.0001这样的形式,而是看两个浮点的差的绝对值是否非常接近零,如Abs(8.2872 - 8.2871 - 0.0001) < 1e-10就认为8.2872 - 8.2871 =0.0001了。
同意 rappercn(rapper)
正是因为浮点数的问题,取出来的值可能是119.9349999.......