这是我正在使用的一些代码:
Function func(x As Double) As Double
func = (x * x) - 5
End Function
Private Sub CommandButton1_Click()
Dim a, b, dok, fa, fb, f0, x0 As Double
a = Val(TextBox1.Text)
b = Val(TextBox2.Text)
dok = Val(TextBox3.Text)
If Not IsNumeric(a) Or Not IsNumeric(b) Or Not IsNumeric(dok) Then
MsgBox ("Incorrect data!")
Else
fa = func(Val(a))
fb = func(Val(b))
If (fa * fb) > 0 Then
MsgBox ("Function does not meet requirements!")
Else
Do While Abs(Val(a) - Val(b)) > Val(dok)
x0 = ((Val(a) + Val(b)) / 2)
f0 = func(Val(x0))
If Abs(Val(f0)) < Val(dok) Then
MsgBox ("OK!")
TextBox4.Text = x0
Exit Do
End If
If (fa * f0) < 0 Then
b = x0
Else
a = x0
f0 = fa
End If
Loop
End If
End If
End Sub
输入数据为 a = 0 和 b = 10,dok = 2。
一切正常,直到在 Do-While 循环的第二步中,变量 x0 获得 2,5 值(这是正常的),并且该值被传递到此处的函数:
f0 = func(Val(x0))
函数 func 获取参数 2 而不是 2,5。为什么这样?我试图将 2,5 参数手动传递给函数并且它有效。我也尝试用类似的方式计算 2,5 并通过它,它也有效。
Dim test, test2 As Double
test = func(2.5)
MsgBox "Result: " & test
test2 = Abs((0 - 5) / 2)
MsgBox "ABS result: " & test2
test = func(test2)
MsgBox "Second result to: " & test
看看您在问题中的表达2.5
方式2,5
,这听起来像是一个本地化问题。具体来说,从功能上的MDSN页面Val
:
Val 函数仅将句点 ( . ) 识别为有效的小数分隔符。当使用不同的十进制分隔符时,如在国际应用程序中,使用 CDbl 将字符串转换为数字。
幸运的是,在这段代码中,冒犯Val
是不必要的:x0
已经是一个 Double,所以没有必要调用Val
它。因此我们可以将该行更改为
f0 = func(x0)
可能是下一行
If Abs(f0) < dok Then
它应该一切正常。
此外,为了使其对十进制输入安全,Val
应从分配fa
和的行中删除fb
,并CDbl
应用于代替Val
TextBox 输入。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句