excel中用VBA写代码取两数之间的较小数,为什么会不精确?

Function min(x As Single, y As Single) As Single
Dim z As Single
If x < y Then
z = x
Else
z = y
End If
min = z
End Function
用上面的代码算出来,比如原来的数是1.2,算出来的min是1.20000004768371,这个问题怎么解决?
还有为什么用 Application.WorksheetFunction.min(a,b)不会出现这样的问题?谢谢!
好像有的时候用Application.WorksheetFunction.min(a,b)也会出现,有时又不会,不知道为什么。。。
经过测试,情况如下:使用我自定义的最小值算法,不管是min(115.1,468)还是min(1579.1-1464,468),结果都是115.09997558;如果使用Application.WorksheetFunction.min(115.1,468),算出来的是115.1,如果Dim a!,b!用Application.WorksheetFunction.min(a-b,468),算出来的又是115.09997558

调用赋值的变量不要使用双精度数,你也使用单精度数即可。 双精度浮点数存在误差是很正常的。

另外可以用cdec转换。

sub a()
dim a as single
a=min(1.3,1.2)
dim b as double
b=cdec(min(1.3,1.2))
debug.print a,b

end sub追问

我用的是单精度啊?是single不是double,你看错了吧

追答

你看不懂上面的程序吗?

我是说你调用min()后你怎么处理后的,你要把min的结果放入什么变量或什么地方。
如果你直接放入单元格可以试一下cdec(min(1.3,1.2))

追问

试过了,精确度提高了不少,但是随着不断计算到后面还是会有误差。因为我那个程序编的时候有一个条件是要加起来相等才向下运算,用这个函数之后到后面加起来已经完全相等了(就是我自己手动相加两者在单元格内均相等,不会出现例如0.0000001这种,误差已经非常非常小了),但是在程序中判断的时候还是会判断出不一样,好纠结。。。还能再精确一点吗?或者要判断“几个数之和是否等于另外一个数”有别的算法?

追答

if abs(x1-x2)<0.00001 then ...

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-07-26
程序在数值运算中,都会产生一定的误差。因此,如果在理论上计算结果a应该等于b,但是在程序代码中如果用a=b作为判断依据往往会出错。所以有经验的程序员会用a与b的差值作为判断依据,例如:if abs(a-b)<0.00001 then等等。
第2个回答  2012-07-26
好像excel的这个问题很多,我是用单变量求解的时候也出现这种问题,结果本来是3,结果是3.00000000001234之类的数字。追问

是啊是啊,怎么解决?好纠结

相似回答