Сравните двойную точность в задаче точности VBA

У меня проблема с сравнением 2 двойных в Excel VBA

предположим, что у меня есть следующий код

Dim a as double Dim b as double a = 0.15 b = 0.01 

После нескольких манипуляций по b, b теперь равно 0,6

однако неточность, связанная с двойным типом данных, дает мне головную боль, потому что

 if a = b then //this will never trigger end if 

Знаете ли вы, как я могу удалить отстающую неточность в двойном типе?

Вы не можете сравнивать значения с плавающей запятой для равенства. См. Статью « Сравнение чисел с плавающей точкой » для обсуждения того, как обрабатывать внутреннюю ошибку.

Это не так просто, как сравнение с постоянной погрешностью, если вы точно не знаете, что такое абсолютный диапазон поплавков заранее.

если вы собираетесь это сделать ….

 Dim a as double Dim b as double a = 0.15 b = 0.01 

вам нужно добавить круглую функцию в ваш оператор IF, как это …

  If Round(a,2) = Round(b,2) Then //code inside block will now trigger. End If 

См. Также дополнительную информацию по Microsoft .

Вот простая функция, которую я написал:

 Function dblCheckTheSame(number1 As Double, number2 As Double, Optional Digits As Integer = 12) As Boolean If (number1 - number2) ^ 2 < (10 ^ -Digits) ^ 2 Then dblCheckTheSame = True Else dblCheckTheSame = False End If End Function 

Назовите его:

 MsgBox dblCheckTheSame(1.2345, 1.23456789) MsgBox dblCheckTheSame(1.2345, 1.23456789, 4) MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002) MsgBox dblCheckTheSame(1.2345678900001, 1.2345678900002, 14) 

Никогда не бывает разумно сравнивать двойники на равенстве.

Некоторые десятичные значения относятся к нескольким представлениям с плавающей запятой. Таким образом, 0,6 не всегда равны 0,6.

Если мы вычитаем один из другого, мы, вероятно, получим что-то вроде 0,00000000051.

Теперь мы можем определить равенство как меньшую разницу, чем определенный запас ошибки.

Как уже отмечалось, многие десятичные числа не могут быть представлены точно как традиционные типы с плавающей запятой. В зависимости от характера вашего проблемного пространства вам может быть лучше использовать десятичный тип VBA, который может представлять десятичные числа (база 10) с совершенной точностью до определенной десятичной точки. Это часто делается для представления денег, например, где часто требуется двузначная десятичная точность.

 Dim a as Decimal Dim b as Decimal a = 0.15 b = 0.01 

Тип данных валюты может быть хорошей альтернативой. Он обрабатывает относительно большие числа с фиксированной точностью в четыре цифры.

  • Сравнение времени
  • Как Python 2 сравнивает строку и int? Почему списки сравниваются больше, чем числа, а кортежи - больше, чем списки?
  • Почему == сравнения с Integer.valueOf (String) дают разные результаты для 127 и 128?
  • Сравнить два списка для поиска общих элементов
  • в чем разница между json и xml
  • .net ORM Сравнение
  • Сравнивая две строки, игнорируя регистр в c #
  • Целочисленный class-shell и оператор == - где указано поведение?
  • Самый простой способ сравнить массивы в C #
  • Как сделать мой случай сравнения строк нечувствительным?
  • Как сделать сравнение строк без учета регистра?
  • Давайте будем гением компьютера.