VBA Val函数更改值?
一个方程式将该值生成为变量/双X:36.0418746812314 但是:VBA Val函数更改值?,vba,Vba,一个方程式将该值生成为变量/双X:36.0418746812314 但是: X Val(X)为真 X CStr(X)为假 X CDdl(X)为假 Val()如何更改值? 在观察列表中查看时,应用X=Val(X)似乎不会改变X的值或类型。但不知何故,它是不同的 例如: A=X-Val(X)非常小,但不是零(2.1316282072803E-14)。 B=X——CStr(X)非常小,但不是零(2.1316282072803E-14)。 C=X——CDbl(X)为零。 更新: 谢谢大家的回复和回答。以
X Val(X)为真
X CStr(X)为假
X CDdl(X)为假
Val()如何更改值?
在观察列表中查看时,应用X=Val(X)似乎不会改变X的值或类型。但不知何故,它是不同的 例如:
A=X-Val(X)非常小,但不是零(2.1316282072803E-14)。
B=X——CStr(X)非常小,但不是零(2.1316282072803E-14)。
C=X——CDbl(X)为零。
更新: 谢谢大家的回复和回答。以下是一些额外的背景 股息调整收盘价公式。据报道被雅虎财经使用。
A1=A0+A0*((P1/S)-P0-D)/P0) 拆分和股息调整收盘价
股票代码:INTC
日期:1980年8月29日星期五
0.306757021582758(雅虎金融计算)
0.306757021582704(我的VBA计算)
将A1转换为字符串CStr(A1)或应用Val(A1),则我的VBA结果与Yahoo Finance的计算值匹配。
这并不是一个实质性的区别,但很高兴了解为什么以及如何使其匹配用于配方验证。
公式来源、组件详细信息和说明。
“雅虎如何计算调整后的收盘价”
CDbl的
功能与您的区域设置相关。Val
功能与美国地区设置相关
如果您在本地区域设置中为Val
函数提供一个值,它将被解释为US格式(句点表示十进制分隔符,逗号表示千位分隔符等)
我的电脑设置为EN-AU设置(类似于EN-US设置),并且Val(36.0418746812314)=36.0418746812314
返回True
,或者在您的语法中,Val(36.0418746812314)36.0418746812314
返回False
考虑此MCVE:
Sub TestingVal()
Dim x As Double, y As Double
x = 36.0418746812314 + 2.1316282072803E-14
y = Val(x)
Debug.Print x, y, x <> y ' 36.0418746812314 36.0418746812314 True
End Sub
只有尾数的最后3位不同!这种差异不足以显示以10为基数的14位小数
现在考虑:
将字符串中包含的数字作为适当类型的数值返回
这意味着,在Val(x)
中,数字x
首先转换为字符串
,以匹配函数的参数类型。这导致其显示值以10为基数。然后Val
将其转换回一个数字,我们将其存储在y
中。由于在第一阶段显示的值不是精确值,因此一些精度位丢失,我们得到了x Val(x)
总之,当计算的最后一位精度很重要时,不要对数字应用Val
。即使您不知道初始变量是双精度还是字符串,也可以使用在这两种情况下都适用的CDbl
。您确定这是X
的确切值吗?我刚刚进行了测试,所有测试都得到了False
。(FWIW-X CStr(X)
隐式等于CStr(X)CStr(X)
,因为VBA需要在执行比较之前执行类型转换。)Hi。实际上,问题是x的实际值是36.0418746812314+2.1316282072803E-14
,但它显示为36.0418746812314
。。。并且Val(x)
将其截断回显示的内容。(即使使用我们的语言环境):(.我正在试图弄清楚如何更精确地显示x
。@A.S.H UseCDec
看起来在这个答案的研究上付出了很多努力-做得好!@YowE3K谢谢你,伙计。更重要的是,我学到了一些“巨大的”今天的事情。我们从不停止学习,即使我们开始脱发……我肯定是在失去脑细胞,但还没有开始脱发(让我的理发师很反感的是——一直抱怨我的头发太厚,需要额外收费来磨剪刀:()当然,另一件需要警惕的事情是试图在任何类型的平等/不平等比较中使用Double
——例如49*CDbl(1/49)=1
由于最后一位的舍入而为False
(如果它只是49*(1/49))=1
您将得到True
-不确定这是由于优化,还是因为它在中间计算中存储了额外的位)为什么不直接使用CDec
而不是CDbl
,并保留打印精度?Debug.Print CDec(36.0418746812314)+CDec(2.1316282072803E-14)'打印36.041874681231421316282072803
0100000001000000000001010101110000100110010010010011010110101110
0100000001000000000001010101110000100110010010010011010110101011
' ^^^