免责声明:我知道 0.025 不能在 IEEE 浮点变量中精确表示,因此,舍入可能不会返回预期的结果。那不是我的问题!
是否可以在 .NET 中模拟 VBA 算术运算符的行为?
例如,在 VBA 中,以下表达式产生3
:
Dim myInt32 As Long
myInt32 = CLng(0.025 * 100) ' yields 3
但是,在 VB.NET 中,以下表达式产生2
:
Dim myInt32 As Integer
myInt32 = CInt(0.025 * 100) ' yields 2
根据规范,两者都应该返回相同的值:
- Long (VBA) 和 Integer (VB.NET) 是 32 位整数类型。
- 根据VBA 规范,CLng 对 Long 进行 Let-coercion,数字类型之间的 Let-coercion 使用 Banker 的舍入。VB.NET 的 CInt也是如此。
0.025
在这两种情况下都是双精度 IEEE 浮点常数。
因此,浮点乘法运算符或整数转换运算符的某些实现细节发生了变化。但是,出于与旧版 VBA 系统兼容的原因,我需要在 .NET 应用程序中复制 VBA 的数学行为(无论它可能是错误的)。
有没有办法做到这一点?有人写了一个Microsoft.VBA.Math
库吗?或者是否在某处记录了精确的VBA 算法,以便我自己做?