Val函数的一个疑问

vbman2003 2008-06-29 07:41:28
测试代码:

Private Sub Command1_Click()
Dim i As Long
For i = 0 To 5
Debug.Print "Print Val(2D" & i & "): " & Val("2D" & i)
Debug.Print "Print Val(2E" & i & "): " & Val("2E" & i)
Next
End Sub

结果:
Print Val(2D0): 2
Print Val(2E0): 2
Print Val(2D1): 20
Print Val(2E1): 20
Print Val(2D2): 200
Print Val(2E2): 200
Print Val(2D3): 2000
Print Val(2E3): 2000
Print Val(2D4): 20000
Print Val(2E4): 20000
Print Val(2D5): 200000
Print Val(2E5): 200000

A到Z中,除了D和E,其它都返回字母前的数字2

百思不得其解,也查不到相关资料,在这儿请教大家了

以前没注意过,昨天回贴时无意中发现的,看来某些情况下,要慎用Val......

...全文
870 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotice_dubin1987 2010-04-23
  • 打赏
  • 举报
回复
嗯,学习lz深思细微的精神
vbman2003 2008-06-29
  • 打赏
  • 举报
回复
改一下测试代码:

Private Sub Command1_Click()
Dim i As Long
Dim s As String
For i = 0 To 5
s = "2D" & CStr(i)
Debug.Print "Print Val(""2D" & i & """): " & Val(s)
s = "2E" & CStr(i)
Debug.Print "Print Val(""2E" & i & """): " & Val(s)
Next
End Sub


结果:
Print Val("2D0"): 2
Print Val("2E0"): 2
Print Val("2D1"): 20
Print Val("2E1"): 20
Print Val("2D2"): 200
Print Val("2E2"): 200
Print Val("2D3"): 2000
Print Val("2E3"): 2000
Print Val("2D4"): 20000
Print Val("2E4"): 20000
Print Val("2D5"): 200000
Print Val("2E5"): 200000


zdingyun 你好!
D和E在Val函数中是如何解析的呢?为什么Val函数参考中没有特别说明?这样的结果好象也没办法解释通......



zdingyun 2008-06-29
  • 打赏
  • 举报
回复
这不是VB的BUG,下列代码显示结果一样,这里的-4.94065645841247E-324是表示一个数,不是字符串:
Private Sub Command1_Click()
Print -4.94065645841247E-324
Print Val(-4.94065645841247E-324)
End Sub

那怕你写成

Private Sub Command1_Click()
Print -4.94065645841247E-324
Print Val(-4.94065645841247D-324)
End Sub

当光标离开D处,D立即变成了E
IamDeane 2008-06-29
  • 打赏
  • 举报
回复
学习了
yachong 2008-06-29
  • 打赏
  • 举报
回复
今天没白逛一圈,又学到新东西了
以前根本不知道科学记数法里面还可以使用D
VBToy 2008-06-29
  • 打赏
  • 举报
回复
看起来D和E都处理成了10的N次方了,2D3=2*10^3。这个函数似乎还有其它一些bug,见http://www.a1vbcode.com/vbtip-57.asp
zdingyun 2008-06-29
  • 打赏
  • 举报
回复
yachong 的回复确实经典.
a5878431 2008-06-29
  • 打赏
  • 举报
回复
哈哈哈,在VB里2D和2E是代表将数字如何存储到内存中的表示方法。所以应当注意!
vbman2003 2008-06-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yachong 的回复:]
在MSDN中搜索“数据类型”,可以找到这么一段:

注意 浮点数值可表示为 mmmEeee 或 mmmDeee ,其中 mmm 是假数,而 eee 是指数(以 10 为底的幂)。Single 数据类型的最大正数值为 3.402823E+38,或 3.4 乘以 10 的 38 次方;Double 数据类型的最大正数值是 1.79769313486232D+308 或 1.8 乘以 10 的 308 次方。用 D 将数值文字中的假数部分和指数部分隔开,就会导致将该值作为 Double 数据类型来处理。同样,用这种方式使用…
[/Quote]

这个应该就是答案!
还是基础不扎实......
如此说来,在字符串处理中,还是要慎用val......

谢谢蚜虫,谢谢各位,明天结贴......

vbman2003 2008-06-29
  • 打赏
  • 举报
回复
回帖是这样的代码:

  Dim s As String
Dim tmp As String
Dim i As Long

s = "A10B20C30D40"
Do
For i = 1 To Len(s)
tmp = Mid(s, i, 1)
If IsNumeric(tmp) Then
tmp = Left(s, i - 1) & Val(Mid(s, i))
Debug.Print tmp
s = Replace(s, tmp, "", , 1)
Exit For
End If
Next
DoEvents
Loop While Len(s)

测试时发现了这个问题

yachong说的或许有道理......


vbman2003 2008-06-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 CathySun118 的回复:]
你那样做本来就不合理,2D,2E已经是16进制的啦,你应该
Debug.Print "Print Val(2D" & i & "): " & Val("&h2D" & i)
Debug.Print "Print Val(2E" & i & "): " & Val("&h2E" & i)
[/Quote]

你没明白我的意思,我是要取一个字符串("A10B20C30D40")中的的所有数字

 
zzyong00 2008-06-29
  • 打赏
  • 举报
回复
顶,
细节决定成败
CathySun118 2008-06-29
  • 打赏
  • 举报
回复
你那样做本来就不合理,2D,2E已经是16进制的啦,你应该
Debug.Print "Print Val(2D" & i & "): " & Val("&h2D" & i)
Debug.Print "Print Val(2E" & i & "): " & Val("&h2E" & i)
红叶哥 2008-06-29
  • 打赏
  • 举报
回复
D,E是代表位數很長
yachong 2008-06-29
  • 打赏
  • 举报
回复
再加上MSDN对val函数的解释
Val 函数,在它不能识别为数字的第一个字符上,停止读入字符串。那些被认为是数值的一部分的符号和字符,例如美圆号与逗号,都不能被识别。但是函数可以识别进位制符号 &O(八进制)和 &H(十六进制)。空白、制表符和换行符都从参数中被去掉。

这样就可以解释所有的测试案例了
yachong 2008-06-29
  • 打赏
  • 举报
回复
在MSDN中搜索“数据类型”,可以找到这么一段:

注意 浮点数值可表示为 mmmEeee 或 mmmDeee ,其中 mmm 是假数,而 eee 是指数(以 10 为底的幂)。Single 数据类型的最大正数值为 3.402823E+38,或 3.4 乘以 10 的 38 次方;Double 数据类型的最大正数值是 1.79769313486232D+308 或 1.8 乘以 10 的 308 次方。用 D 将数值文字中的假数部分和指数部分隔开,就会导致将该值作为 Double 数据类型来处理。同样,用这种方式使用 E,也会导致将该值作为 Single 数据类型来处理。
yachong 2008-06-29
  • 打赏
  • 举报
回复
http://tieba.baidu.com/f?kz=17287890
有这么一段
一、VB的数据类型
VB中为了便于计算机的处理,充分利用计算机的系统资源,对程序中使用的变量或数据,根据其作用以及所表达的值的不同范围,规定了各种不同的类型。VB的数据类型比较丰富,主要由两部分组成:基本数据类型和用户自定义类型,本节中我们只介绍几种最常用的基本数据类型,其余的类型以后再作介绍。VB基本数据类型见下表。
类型 占用字节 值的有效范围 类型声明符
Integer(整型) 2 -32768~32767 %
Long(长整型) 4 -2147483648~2147483647 &
Single(单精度) 4 +1.40E-45~+3.40E38 !
Double(双精度) 8 +4.97D-324~+1.79D308 #
String(字符串) 1/每字符 0~65535个字符 $
Boolean(布尔型) 1 True或 False
Variant(通用型) 上述有效范围之一
整型数是不带小数且范围在-32768~32767之间的整数,在内存中用2个字节来存放一个整型数。在-32768~32767之间的整数,若在尾部加一个“%”也表示一个整型数,如-1235%,768%。
长整型数是范围在-2147483648~2147483647之间的整数,在内存中用4个字节来存放一个整型数。在-2147483648~2147483647之间的整数,若在尾部加一个“&”也表示一个长整型数。
单精度数是带小数的实数,有效值为7位,在内存中用4个字节来存放一个单精度数,它通常以指数的形式(科学记数法)来表示,在计算机中以“e”或“E”表示指数部分。单精度数取数范围在+1.40E-45~+3.40E38之间,或在一个实数的尾部加一个“!”也表示一个单精度数。
双精度数是也带小数的实数,有效位数为15位,在内存中用8个字节来存放一个双精度数,它通常以指数的形式(科学记数法)来表示,在计算机中以“d”或“D”表示指数部分。双精度数取数范围在+4.97D-324~+1.79D308之间,或在一个实数的尾部加一个“#”也表示一个双精度数。
字符串类型用以定义一个字符序列,在内存中一个字符用一个字节来存放。在程序中若引用一个字符串常数则必须用双引号“”将引用的字符括起来,如“How are you!”,”123+456”。
课程介绍:第一章:正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。第二章:http协议是一种无状态协议,不记录用户行为,我们可以利用cookie记录数据,方便用户操作,提升用户体验。第三章:ECMAScript6.0(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。它的目标,是使得JavaScript语言可以用来编写复杂的大型应用程序,成为企业级开发语言。第四章:本章主要讲解JS动画原理、动画函数封装和轮播。第五章:本章主要讲解面向对象、构造函数和继承、原型链和继承。第六章:本节课程主要讲解了什么是Ajax、如何使用Ajax发送get请求、如何使用Ajax发送post请求、JSON数据格式、回调地狱、Promise和Ajax的同源策略、跨域请求。第七章:本章主要讲解html、val、attr、prop、class、全选框、动画、节点遍历、ajax、sonp、event、multiple、plugin、plugin、magnifier。第八章:本章主要讲解UML类图、单例模式、工厂模式、策略模式、代理模式、观察者模式。第九章:本章主要讲解为什么要模块化、原生JS中,模块的写法、AMD、CommonJS&Webpack。第十章:本节课程主要讲解了服务器安装环境配置、端口及ip基本常识、简单认识PHP(helloworld)、基本语法和动态网页原理。第十一章:本节课程主要讲解了什么是SASS、SASS的预处理、ass语法(变量、嵌套、导入、mixin、扩展、function、expression)。第十二章:本节课程主要讲解了什么是GULP、GULP环境配置、GULP基本使用及GULP的插件安装与使用。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧