Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Val函数更改值?_Vba - Fatal编程技术网

VBA Val函数更改值?

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: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)为零。

更新: 谢谢大家的回复和回答。以下是一些额外的背景

股息调整收盘价公式。据报道被雅虎财经使用。
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 Use
CDec
看起来在这个答案的研究上付出了很多努力-做得好!@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
'                                                            ^^^