以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  关于单精度的疑问  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=32840)

--  作者:Neha
--  发布时间:2013/5/9 9:42:00
--  关于单精度的疑问
0.48-0.4=多少
--  作者:XYT
--  发布时间:2013/5/9 9:45:00
--  
0.08
--  作者:Neha
--  发布时间:2013/5/9 10:01:00
--  
不对,我这里结果是一串9
--  作者:XYT
--  发布时间:2013/5/9 10:20:00
--  
怎么可能是一串9啊
图片点击可在新窗口打开查看此主题相关图片如下:2.jpg
图片点击可在新窗口打开查看

--  作者:Neha
--  发布时间:2013/5/9 10:36:00
--  
在命令窗口试,定义两个单精度,然后相减输出结果,我手机上的没法截屏
--  作者:XYT
--  发布时间:2013/5/9 10:41:00
--  
也没错啊,只是保留了7位有效数字
图片点击可在新窗口打开查看此主题相关图片如下:3.jpg
图片点击可在新窗口打开查看

图片点击可在新窗口打开查看此主题相关图片如下:4.jpg
图片点击可在新窗口打开查看
[此贴子已经被作者于2013-5-9 10:41:28编辑过]

--  作者:gsnake
--  发布时间:2013/5/9 10:44:00
--  
没错啊!
0.07999998


--  作者:gsnake
--  发布时间:2013/5/9 10:47:00
--  
=0.07999998的原因
这里可能帮到你

1不等于1?

在命令窗口输入下面的代码:

Dim d As Double
d =
0.7 + 0.2 + 0.1
Output.Show(d)
Output.Show(d =
1
)

执行之后,你会惊讶地发现,d和1并不相等。
这是怎么回事,0.7 + 0.2 + 0.1明明就是1,而且第三条语句也证明了d的结果就是1啊。
这是因为d是Double类型,是浮点数,浮点数的1,可能并不会精确地等于1,而只是近似等于1。
毋需过分担心这种误差,这种误差只有10的负16次方左右,对日常计算的结果不会有任何影响,但是会影响数值比较的结果

如果需要精确比较两个数值,该如何处理呢,可以将上述代码改为:

Dim d As Double
d =
0.7 + 0.2 + 0.1
Output.Show(d)
Output.Show(Math.Round(d,
6) = 1
)

上面的代码,用Round函数将d的小数位数四舍五入到6位,然后再和1比较。

或者用Decimal类型代替Double类型:

Dim d As Decimal
d =
0.7 + 0.2 + 0.1
Output.Show(d)
Output.Show(d =
1
)

Decimal是高精度小数,不会有Double的那种误差。

 


--  作者:Neha
--  发布时间:2013/5/9 11:02:00
--  
感谢大家,改高精度结果对了
--  作者:Neha
--  发布时间:2013/5/9 11:06:00
--  
现在项目所有题都解决了,就打印机,疑难杂症吧