出于某种原因,以下语句评估为零。我认为这是由于溢出而造成的,但是所有的临时值似乎都符合双重的范围。
DiffieHellmanKey = (43 ^ 47) - (53 * Fix((43 ^ 47) / 53))
我认为这是溢出
DiffieHellmanKey = (5 ^ 22) - (53 * Fix((5 ^ 22) / 53))
什么给?现在,回到给我溢出的原始数字。所有涉及的变量都是双打。如果我将其计算为工作表公式而不是在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 Basical本地进行此大型数学。
? (43^47)
5.92949097309764E+76
? 53*Fix((43^47)/53)
5.92949097309764E+76
? (53*Fix((43^47)/53)) = (43^47)
True