求教: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
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
关于VB.net中的验证控件
小弟正在开发一个C/S结构程序,有几个界面有较多的textbox,是关于用户数据输入的,现在想做验证,听说有验证控...
-
多表查询问题
我有三个表,一个表为基本表,一个是代码表,一个是出差表
表一 编号,姓名 ,职别
001 李三 101
...
-
DATAGRIDVIEW无法删除未提交的新行?
再DATAGRIDVIEW录入时,想删除最后自动新增的一行,提示无法删除未提交的新行
Private Sub Dat...
-
迷茫了几天,求各位高手指教一下!下面是我的代码!
<!--#include file="webconfig.asp"-->
<%
Dim SortID
SortID=Trim(FLib.SafeSql(R...
-
vb.net 断开和连接网络连接 修改代码
在vb.net中实现断开和连接网络连接的代码,我在网上找了一段代码
Option Explicit On
'首...
-
DataGridView直接导出EXCEL
如何直接读取DataGridView中的数据,并导出成Excel可以直接读取的文件
记住,我不要通过DataTable。
希...
-
求教:如何在vb.net下做一些好看的界面,整一些好看的效果,改变控件,让控件变得好看点?
有没有点例子?有没有点直接可以做控件的软件?
---...
-
在VB中,对SQL数据库进行增删改语句怎么写呢?
小弟做课程设计,遇到了一点小麻烦,卡在了这里,不知道在VB中怎么写对SQL数据库的增删改...
-
文本框中的数字精确到小数点后两位
请问如何让文本框输入数字后精确到小数点后两位,如:当输入112时,显示为112.00
------解决方案--...
-
VB.NET2008如何利用SendMessage修改按钮的Text?
为了测试 Windows API ,试图点Button用SendMessage修改该按钮的Text,竟然没成功,请教...