val转换里%是一个特殊用法,如果%之后没有其它字符,则表示前面的数值按照short整数类型(http://www.foxtable.com/webhelp/topics/0208.htm)进行转换。123.12是小数,val里是使用CShort强制转换,自然就出错了。
下面是val函数源码的一部分,可以看到,如果要转换的字符串最后是&表示转换为int整数,如果是@表示转换为双精度,!表示转换为单精度
Select Case ch
Case "&"c
If (num5 > 0) Then
Throw ExceptionUtils.VbMakeException(13)
End If
Return CInt(Math.Round(num7))
Case "@"c
Return Convert.ToDouble(New Decimal(num7))
Case "!"c
Return CSng(num7)
Case "%"c
If (num5 > 0) Then
Throw ExceptionUtils.VbMakeException(13)
End If
Return CShort(Math.Round(num7))
End Select