Потеря точности в Галактике ERP

Приемы и подходы, обмен опытом

Модераторы: Screw, larin

Ответить
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Потеря точности в Галактике ERP

Сообщение falcon »

Хотел бы обсудить с пользователями форума следующую проблему.
При вычислении разности чисел 0.91 и 0.90 результат равен 0.01, а при вычислении разности чисел 10.91 и 10.90 результат не равен 0.01
Можно подобрать сколь угодно много примеров таких ошибок.. Ошибка не зависит от платформы СУБД.
Ниже код демонстрирующий данную ошибку:

Код: Выделить всё

!.Form 'TAP_TestSum'
.Set Name 'TAP_TestSum'
.Ard
.NameInList 'Проверка разности чисел'
.Var
 sumP : Double;
 sumL : Double;
.EndVar
.Begin
  sumP := 0.91;
  sumL := 0.90;
End.
.{?Internal; ((sumP-sumL) = 0.01)
 Разность чисел 0.91 и 0.90  равна 0.01
.}
-----------------------------------
.Begin
  sumP := 10.91;
  sumL := 10.90;
End.
.{?Internal; ((sumP-sumL) <> 0.01)
 Разность чисел 10.91 и 10.90  НЕ равна 0.01
.}
.EndForm
Ответ тех. поддержки поставил меня в значительное затруднение...не смог даже найти слов для продолжения дискуссии.
Ответ: Потому что не надо проверять действительные числа на равенство!!
Предлагаю высказать ваши мнения по данной проблеме и действительно ли работая в бухгалтерской программе мы не имеем права сравнивать числа с запятой.
den
заказчик
Сообщения: 117
Зарегистрирован: Пт, 26/10/2007 14:16
Имя Фамилия: Денис Кучин
Откуда: Геомостпроект НПО

Re: Потеря точности в Галактике ERP

Сообщение den »

Продублируйте тему на форуме профильном тюмбита. Там хоть какой то народ тусуется и что то обсуждается . Здесь только что новости выкладывают.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Потеря точности в Галактике ERP

Сообщение larin »

Да, к сожалению элементарная математика не такая уж и элементарная

https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 0%BE%D0%B9

https://ru.wikipedia.org/wiki/%D0%A7%D0 ... 0%BE%D0%B9

Попробуй этот пример:

Код: Выделить всё

!.Form 'TAP_TestSumDecimal'
.Set Name 'TAP_TestSumDecimal'
.Ard
.NameInList 'Проверка разности чисел Decimal'
.Var
 sumP : Decimal(31,15);
 sumL : Decimal(31,15);
.EndVar
.Begin
  sumP := 0.91;
  sumL := 0.90;
End.
.{?Internal; ((sumP-sumL) = 0.01)
 Разность чисел 0.91 и 0.90  равна 0.01
.}
-----------------------------------
.Begin
  sumP := 10.91;
  sumL := 10.90;
End.
.{?Internal; ((sumP-sumL) <> 0.01)
 Разность чисел 10.91 и 10.90  НЕ равна 0.01
.}
.EndForm
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Потеря точности в Галактике ERP

Сообщение larin »

А еще ваши тесты покажут более удивительный результат если в Galnet.cfg добавить
[Common]
DeltaDouble=0.000000005
falcon
партнер
Сообщения: 45
Зарегистрирован: Чт, 04/10/2007 09:27
Имя Фамилия: Александр Волков
Откуда: Фалькон плюс

Re: Потеря точности в Галактике ERP

Сообщение falcon »

[Common]
DeltaDouble=0.00000000000001

Благодарю Вас за данный параметр. Очень помог, не пришлось изменять написанный ранее код в отчетах.
Аватара пользователя
larin
топ-софт
Сообщения: 228
Зарегистрирован: Пн, 10/09/2007 12:13
Имя Фамилия: Михаил Ларин
Откуда: ТопCофт
Контактная информация:

Re: Потеря точности в Галактике ERP

Сообщение larin »

Но все же лучше переписать код в отчетах, там где идет сравнение копеек

вместо

Код: Выделить всё

var a, b : double;
if( a = b )
{
   // равно по математике
}
else
{
   // не равно
}
лучше сделать

Код: Выделить всё

var a, b : double;
if( abs(a - b) <= 0.005 )
{
   // приблизительно равно по бухгалтерии, если отличается меньше чем на полкопейки
}
else
{
   // не равно, почти на целую копейку
}
Стамп
Сообщения: 1
Зарегистрирован: Вт, 05/07/2016 11:15
Имя Фамилия: Прокофьев Игорь
Откуда: Топ Софт
Контактная информация:

Re: Потеря точности в Галактике ERP

Сообщение Стамп »

Ответ тех. поддержки поставил меня в значительное затруднение...не смог даже найти слов для продолжения дискуссии.
Ответ: Потому что не надо проверять действительные числа на равенство!!
что же вы не привели весь ответ тех.поддержки ??
396920383f.jpg
396920383f.jpg (289.22 КБ) 12831 просмотр
Ответить