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 检查数字是否具有整数立方根_Vba - Fatal编程技术网

Vba 检查数字是否具有整数立方根

Vba 检查数字是否具有整数立方根,vba,Vba,我正在尝试检查给定的数字在VBA中是否为cuberoot。 以下代码仅适用于2和3作为答案,之后不起作用。 我试图找出代码中的错误 Sub cuberoot() Dim n As Long, p As Long, x As Long, y As Long x = InputBox("x= ") If Iscube(x) Then MsgBox ("Is cube") Else MsgBox ("No cube") End

我正在尝试检查给定的数字在VBA中是否为cuberoot。
以下代码仅适用于2和3作为答案,之后不起作用。
我试图找出代码中的错误

Sub cuberoot()
    Dim n As Long, p As Long, x As Long, y As Long

    x = InputBox("x= ")
    If Iscube(x) Then
        MsgBox ("Is cube")
    Else
        MsgBox ("No cube")
    End If
End Sub


由于您传递的是一个
Long
,因此我假设您的数字不会大于大约2*10^9,因此这应该始终有效。这是一个微小的变化,在这里您截断double,然后与两个最近的整数进行比较,以确保捕获任何舍入错误

编辑:在VBA中,截断总是四舍五入的,因此只需要检查第三个根值:

Public Function Iscube(a As Long) As Boolean

Dim b As Integer
b = CInt(a ^ (1# / 3#))

If (b ^ 3 = a) Then
    Iscube = True
Else
    Iscube = False
End If

End Function

如果你需要一个大于<代码>长的数字,你需要改变你的输入类型,你可能需要考虑一个迭代方法,比如二进制搜索或者牛顿Raphson求解器。 如果添加一个

尺寸b尽可能长

如果你调试你的代码,你会看到125中的feed给你带来的好处

b=5
Int(b)=4

更新代码

您可以将布尔测试缩短为

Function Iscube(lngIn As Long) As Boolean
Iscube = (Val(lngIn ^ (1 / 3)) = Int(Val(lngIn ^ (1 / 3))))
End Function

请注意,如果您使用double调用它,它将仅在长部分上运行(因此它将看到
IsCube(64.01)
IsCube(64)

如果我输入
125
,它是
5
的立方根,我正确地得到了答案
是cube
,即使你说它只适用于
2
3
。我认为你应该澄清什么是输入、你期望的输出和你得到的输出,以便我们理解你的意思。否则,我只能说,根据您的描述,您的代码应该可以正常工作。@MatteoNNZ没有维度b,只要上面的代码对我无效,因为int(b)返回4。@Apurva我希望您已经找到了问题的答案。如果是这样,这里的习惯是接受为您的问题提供最佳解决方案的答案。你可以阅读更多关于这方面的内容。
Function Iscube(lngIn As Long) As Boolean
Iscube = (Val(lngIn ^ (1 / 3)) = Int(Val(lngIn ^ (1 / 3))))
End Function