标题:VB中如何解决浮点问题?
只看楼主
zsolong
Rank: 1
等 级:新手上路
威 望:1
帖 子:193
专家分:0
注 册:2006-12-15
得分:0 
Double型的就是有这样的问题,他
a=45.3
b=45
c=a-b
此时C应该等于0.3,但是结果却是0.2999999.....
结果确实是这样子的,主要是由于双精度性的。其实用Single型,一般都是可以的。Double除非必须要用,一般是不提倡用的。

2007-01-25 15:53
海蓝啸
Rank: 5Rank: 5
来 自:安徽
等 级:贵宾
威 望:17
帖 子:1611
专家分:0
注 册:2006-4-3
得分:0 
我試了一下....果然不行....不知道怎麼回事....
但是C語言卻可以....我以為VB也是一樣

这个社会太复杂。。。
2007-01-25 16:01
zsolong
Rank: 1
等 级:新手上路
威 望:1
帖 子:193
专家分:0
注 册:2006-12-15
得分:0 
C里面有Float型比较好,VB里面没有。
所以一般建议用Single型,结合使用Format("**","#.####")进行四舍五入

2007-01-25 16:05
wudimp
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-19
得分:0 
听周围同事说,产生这个的原因是:计算机由二进制转换成十进制时在表示上出现的不精确现象,不知道这个解释合理不?
反正我现在是想用最好的方法来得到尽可能精确的的数据....
2007-01-25 16:22
wudimp
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-19
得分:0 

我对楼上各位所给的方法进行了实验结果如下:
Dim a As Single
Dim b As Single
Dim c As Single
a = 45.3
b = 45
c = a - b
Print c
结果是:0.2999992
Dim a As Variant
Dim b As Variant
Dim c As Single
a = 45.3
b = 45
c = a - b
Print c
结果是:0.3
Dim a As Variant
Dim b As Variant
Dim c As Variant
a = 45.3
b = 45
c = a - b
Print c
结果是:0.299999999999997
第二种方法的结果是正确的,但是我觉得变量定义起来有点困难,因为变量要反复使用,总觉得Variant类型不可靠....(现在还没有出现具体的问题).

2007-01-25 16:34
zsolong
Rank: 1
等 级:新手上路
威 望:1
帖 子:193
专家分:0
注 册:2006-12-15
得分:0 

这里只是特殊情况,才会定义变体型的,一般是不提倡用变体型的,确实在有时候会造成混淆!

Private Sub cmdCount_Click()
Dim a As Double
Dim b As Double
Dim c As Single

a = 45.3
b = 45
c = a - b

MsgBox "" & c & ""

End Sub

这里的c=0.3,也是正确的。

[此贴子已经被作者于2007-1-25 18:34:52编辑过]


2007-01-25 18:28
wudimp
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-19
得分:0 

为什么用Msgbox就可以了?必须用吗?

2007-02-01 18:06
gaizihao
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-2-2
得分:0 

建议将a,b都转换为整数进行计算,然后再计算结果转化为小数

2007-02-02 11:51
gcwen
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2006-11-6
得分:0 
我在编程中也遇到这种问题,很烦人!我只好将它四舍五入,这样问题就解决了,但是心里还是不爽。感觉basic语言还是不如c语言
2007-02-03 15:57
wudimp
Rank: 1
等 级:新手上路
帖 子:15
专家分:0
注 册:2005-12-19
得分:0 
问题出来了!!

我现在写的是一个度分秒转化的例子:
不能得出正确答案~
Private Sub Command1_Click()
Dim ysjd As Single
Dim zhhjd As Single

ysjd = Val(Text1.Text)
zhhjd = DEG(ysjd)
Text2.Text = zhhjd
End Sub
--------------------------------------------------
Function DEG(de As Single) As Single
Dim d1 As Single
Dim d2 As Single
Dim d3 As Single
Dim sign As Integer
sign = Sgn(de)
de = Abs(de)
d1 = Int(de)
d2 = Int((de - d1) * 100)
d3 = (de - d1 - d2 / 100) * 10000
DEG = sign * (d1 + d2 / 60 + d3 / 3600)
End Function

程序说明:这是一个“度分秒”转化为“度”的程序,比如我输入40.3000,表示40°30′00″转化为40.5°
我现在输入的数据text1文本框是40.3000,转化结果却成了40.51111,我把数据类型改了几个都没有解决,怎么办呢,为了后边程序的使用,我必须要把这个DEG函数功能写到模块里边.

2007-02-08 17:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-117329-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.175311 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved