使用双打(Excel)的VBA溢出不正确



出于某种原因,以下语句评估为零。我认为这是由于溢出而造成的,但是所有的临时值似乎都符合双重的范围。

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

最新更新