专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VB Dotnet

求教:Vb.net下的一个数值有关问题

发布时间:2011-06-23 16:01:03 文章来源:www.iduyao.cn 采编人员:星星草
求教:Vb.net下的一个数值问题

我有一个程序段:For循环
dim   y1BeginData   as   single=-4.0f
dim   y1KdValue   as   singel=0.8f
......
for   ykdIdx   as   integer=0   to   10
    dim   ykdV   as   single=y1BeginData+ykdIdx*y1KdValue
    ......
next

在这个程序段运行时,竟然出现当ykdIdx=3时,ykdV=-1.5999999
当ykdIdx=4时,ykdV=-0.799999952;当ykdIdx=5时,ykdV=0.0000000596046448;当ykdIdx=6时,ykdV=0.8000001;当ykdIdx=7时,ykdV=1.60000014;其他值正常,而实际上这几个值分别应为:-1.6,-0.8,0,0.8,1.6;请教一下,出现这个情况到底是怎么回事,如何解决?谢谢
http://hzyup.blog.163.com/blog/static/1033260120070411359498

------解决方案--------------------
这正是计算机常见的问题:要知道计算机是以二进制数来表示任何数值的,自然,文体究出来了:并不是所有的小数都可以用二进制浮点数精确表示,而是表示为最靠近它的临近区分出来的小数!
------解决方案--------------------
根据楼主的代码,在VS2005中运行结果如下:
-4
-3.2
-2.4
-1.6
-0.8
5.960464E-08
0.8000001
1.6
2.4
3.2
4
可以看出vs2005的数据定义和取值精度比vs2003有了比较大的不同,原因同rock29(rock)所说~~
------解决方案--------------------
在使用浮点数(Single 数据类型 (Visual Basic) 和 Double 数据类型 (Visual Basic))时,请记住,它们作为二进位分式存储。这就意味着,对于任何非二进位分式(形式为 k / (2 ^ n,其中 k 和 n 均为整数)的数量,浮点数无法保存它们的精确表示形式。例如,0.5 (= 1/2) 和 0.3125 (= 5/16) 可保存为精确的值,而 0.2 (= 1/5) 和 0.3 (= 3/10) 只能是近似值。

由于这一不精确性,因此,在处理浮点值时,不能指望会获得精确的结果。具体而言,理论上相等的两个值可能会具有略微不同的表示形式。

比较浮点数量
使用 System 命名空间中的 Math 类的 Abs 方法,计算各数量之间的差值的绝对值。

确定可接受的最大差值,这样一来,如果两个数量之间的差值不超过此值,则可以认为这两个数量实际上是相等的。

将差值的绝对值与可接受的差值进行比较。

下面的示例演示有关两个 Double 值的正确和错误的比较。

Visual Basic 复制代码
Dim oneThird As Double = 1.0 / 3.0
Dim pointThrees As Double = 0.333333333333333

' The following comparison does not indicate equality.
Dim exactlyEqual As Boolean = (oneThird = pointThrees)

' The following comparison indicates equality.
Dim closeEnough As Double = 0.000000000000001
Dim absoluteDifference As Double = Math.Abs(oneThird - pointThrees)
Dim practicallyEqual As Boolean = (absoluteDifference < closeEnough)

MsgBox( "1.0 / 3.0 is represented as " & oneThird.ToString( "G17 ") _
& vbCrLf & "0.333333333333333 is represented as " _
& pointThrees.ToString( "G17 ") _
& vbCrLf & "Exact comparison generates " & CStr(exactlyEqual) _
& vbCrLf & "Acceptable difference comparison generates " _
& CStr(practicallyEqual))



上面的示例使用了 Double 结构的 ToString 方法,因此,它可以指定比在使用 CStr 关键字时更高的精度。默认精度是 15 位数字,但“G17”格式将其扩展到 17 位数字。

Mod 运算符未返回准确的结果
由于浮点存储的不精确性,如果至少一个操作数为浮点数,Mod 运算符 (Visual Basic) 可能会返回意外的结果。

Decimal 数据类型 (Visual Basic) 不使用浮点表示形式。在 Single 和 Double 中不精确的许多数字在 Decimal 中是精确的数字(例如 0.2 和 0.3)。虽然浮点表示形式在算术运算速度上比 Decimal 表示形式快,但可能值得用性能的下降换回精度的提高。

找出浮点数量的整数余数
将变量声明为 Decimal。

使用文本类型字符 D 将文本强制转换为 Decimal,以防文本的值相对于 Long 数据类型太大。

下面的示例演示了浮点操作数潜在的不精确性。

Visual Basic 复制代码
Dim two As Double = 2.0
Dim zeroPointTwo As Double = 0.2
Dim quotient As Double = two / zeroPointTwo
Dim doubleRemainder As Double = two Mod zeroPointTwo

MsgBox( "2.0 is represented as " & two.ToString( "G17 ") _
& vbCrLf & "0.2 is represented as " & zeroPointTwo.ToString( "G17 ") _
& vbCrLf & "2.0 / 0.2 generates " & quotient.ToString( "G17 ") _
& vbCrLf & "2.0 Mod 0.2 generates " _
& doubleRemainder.ToString( "G17 "))

Dim decimalRemainder As Decimal = 2D Mod 0.2D
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: