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

Программирование на Atlantis: приемы и подходы, обмен опытом

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

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

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

Сообщение falcon » Чт, 05/05/2016 11:22

Хотел бы обсудить с пользователями форума следующую проблему.
При вычислении разности чисел 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 » Пт, 13/05/2016 10:32

Продублируйте тему на форуме профильном тюмбита. Там хоть какой то народ тусуется и что то обсуждается . Здесь только что новости выкладывают.

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

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

Сообщение larin » Пт, 13/05/2016 17:02

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

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 » Пт, 13/05/2016 20:56

А еще ваши тесты покажут более удивительный результат если в Galnet.cfg добавить
[Common]
DeltaDouble=0.000000005

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

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

Сообщение falcon » Вт, 17/05/2016 15:08

[Common]
DeltaDouble=0.00000000000001

Благодарю Вас за данный параметр. Очень помог, не пришлось изменять написанный ранее код в отчетах.

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

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

Сообщение larin » Ср, 18/05/2016 16:54

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

вместо

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

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

Сообщение Стамп » Пт, 16/09/2016 10:29

Ответ тех. поддержки поставил меня в значительное затруднение...не смог даже найти слов для продолжения дискуссии.
Ответ: Потому что не надо проверять действительные числа на равенство!!

что же вы не привели весь ответ тех.поддержки ??

396920383f.jpg
396920383f.jpg (289.22 КБ) 6154 просмотра


Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя