主题:求原因
jianghongbo1
[专家分:410] 发布于 2008-05-31 18:43:00
用vb6.0做了一个计算器,计算12345.78-12345.89,结果是-0.109999999998763:计算23.45-23.99结果是-0.539999999999999,很纳闷,下载了别人的一试,也有这个毛病,有人知道什么原因吗?为什么只有减法出现此问题.
回复列表 (共3个回复)
沙发
一江秋水 [专家分:9680] 发布于 2008-05-31 20:28:00
在网上看到一篇问答,也许能解答你的疑问
问题:我有一个问题,在VB中计算 8.28725321453883 - 8.28725321453882 的值,结果是 8.88178419700125E-15 ,而计算 8.2872 - 8.2871 的结果为 9.99999999997669E-05 ,不知这到底是什么原因?但是 0.00002-0.000015 的计算结果却是正确的 .000005 ,甚至 0.00000002-0.0000000151 的结果也是正确的 .0000000049。操作数我是用 Double ,够精确了吧!但 8.2872 - 8.2871 的结果就是 9.99999999997669E-05,这些都是在 “立即”窗口中计算的结果(程序中也一样!)
回答:
计算机中浮点数是离散分布的。所以绝大多数的数只能以一个接近它的数来表示,接近的程度依赖于数的精度(单精度,双精度)。例如 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了。
板凳
老大徒伤悲 [专家分:29120] 发布于 2008-05-31 20:53:00
有一个笨笨的方法来解决:
减数、被减数、都乘10,幂减1
直到,全成了整数
相减
差除以10,幂加1
直到幂为0
我来回复