由于某种原因,以下语句的计算结果为零。我认为这是由于溢出造成的,但所有临时值似乎都在 double 值的范围内。
DiffieHellmanKey = (43 ^ 47) - (53 * Fix((43 ^ 47) / 53))
我认为这是溢出,因为当我用不同的数字(如下)执行它时,它会得到正确的值 29。
DiffieHellmanKey = (5 ^ 22) - (53 * Fix((5 ^ 22) / 53))
什么给了?现在,回到让我溢出的原始数字。所有涉及的变量都是 double 。如果我将其计算为工作表公式而不是 VBA,它甚至不起作用:
=(43 ^ 47) - (53 * ROUNDDOWN(((43 ^ 47) / 53), 0))
如果我使用等效形式(如下)在 VBA 中实现上述示例,我会得到错误的结果 -1.75357E+62。
DiffieHellmanKey = (43 ^ 47) - (53 * WorksheetFunction.RoundDown(((43 ^ 47) / 53), 0))
最佳答案
你是对的,但你的问题不在于溢出,而在于有效数字。
Microsoft Excel 中的数字永远不能超过 15 位有效数字,但小数点可以大到 127。
来源:http://msdn.microsoft.com/en-us/library/office/ff838588.aspx
这就是您的原始公式所发生的情况:
(43 ^ 47) - (53 * Fix((43 ^ 47)/53))
简化为 (43 ^ 47) - fix(43 ^ 47)
然后 (43^47) 大约有 76 位长,因此它们都被削减到相同的数量并等于 0。
VBA 中最大的变量类型是“十进制”,它仅包含 29 位有效数字。您将无法使用 Visual Basic 本身执行如此大规模的数学运算。
关于excel - 使用 double 的 VBA 溢出不正确 (Excel),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12965805/