Отказ от ответственности: я знаю, что 0.025 не может быть точно представлен в переменных IEEE с плавающей запятой, и, таким образом, округление может не вернуть то, что можно было бы ожидать. Это не мой вопрос!
Можно ли моделировать поведение арифметических операторов VBA в .NET?
Например, в 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 выполняет Let-coercion to Long, а Let-coercion между числовыми типами использует округление Banker. То же самое верно и для VB.NET CInt.
-
0.025
- это константа с плавающей точкой IEEE с двойной точностью в обоих случаях.
Таким образом, некоторые детали реализации операции умножения с плавающей запятой или оператора целочисленного преобразования изменились. Однако, по соображениям совместимости с устаревшей системой VBA, мне нужно будет реплицировать математическое поведение VBA (как бы оно ни было неправильно) в приложении .NET.
Есть ли способ сделать это? Кто-нибудь написал библиотеку Microsoft.VBA.Math
? Или точный алгоритм VBA документирован где-то, чтобы я мог сделать это сам?