Форум » [x]Harbour » Странное поведение при проверке на равенство 0 (баг) » Ответить

Странное поведение при проверке на равенство 0 (баг)

azoo: Обнаружил следующий парадокс. Смотрите пример кода : [quote] ? "arotp[i,5] = " ,arotp[i,5] ,"arotp[i,5]#0 = ", arotp[i,5]#0 wait [/quote] А теперь результат: [quote] arotp[i,5] = 0.00 arotp[i,5]#0 = .T. Press any key to continue... [/quote] Периодически сталкиваюсь с таким багом, иногда делал двойное преобразование, сначала цифру в строку, потом строку в цифру, полученная цифра уже равнялась 0. [quote] ? "arotp[i,5] = " ,arotp[i,5] ,"arotp[i,5]#0 = ", arotp[i,5]#0 arotp[i,5]=val(str(arotp[i,5])) ? "arotp[i,5] = " ,arotp[i,5] ,"arotp[i,5]#0 = ", arotp[i,5]#0 [/quote] Результат: [quote] arotp[i,5] = 0.00 arotp[i,5]#0 = .T. arotp[i,5] = 0.00 arotp[i,5]#0 = .F. Press any key to continue... [/quote] По-моему эта ошибка ещё была в Clipper, теперь и в Harbour перекочевала.

Ответов - 2

alkresin: При выводе на экран количество десятичных знаков соответствует SET DECIMALS, а на самом деле их может быть и больше. Попробуйте, например: x := 1/3 - 0.33 ? x // Выведется 0.00, хотя там 0.00333... ? x == 0 // Выведется .F. ? x+100 // 0.33

azoo: alkresin, не тот случай. Поставил SET DECIMALS TO 6. Всё равно выводит на экран значение 0.00 Видно с массивами как-то по другому. Изначально в массиве значение из поля БД, потом по алгоритму данные отнимаются из этой ячейки, доходя до 0 или не доходя. Вот попробовал смоделировать ситуацию: set deci to 10 a=33 for i=1 to 99 a -= (1/3) next ? "a = ", a, "a#0 = " , a#0 a=val(str(a)) ? "a = ", a, "a#0 = " , a#0 Результат: a = 0.000000000 a#0 = .T. a = 0.000000000 a#0 = .F.     



полная версия страницы