Что с оператором "if"?

Страницы: 1
RSS
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
Пример кода:
....
function ...(dp)
for i=-8.8,-0.8 do
--message(i.."/"..dp)
     if dp==i then
.....
    end
 end
end
...
Для проверки совпадения переменных включил оператор message, совпадения происходят а проход через if нет.
Оговорюсь что пару дней назад все работало.
Файлы dat и info.log удалял не помогло, откат обновления не делал.
Это что америка начала воплощать хакерские угрозы :D Или это подтверждение существования практики двойных стандартов и программировании:D
 
Здравствуйте,
Все дело в типе данных DOUBLE сравнивать нужно с заданной точностью. На просторах интернета Вы найдете очень много статей по этой теме.
 
Забыл уточнить числа округлены. Я так думаю проще будет оба числа для верности умножить на 100...
 
Цитата
lergen написал:
Забыл уточнить числа округлены. Я так думаю проще будет оба числа для верности умножить на 100...
это не поможет
 
ну а если умножить на 100 и округлить через math.floor? тогда поможет?  
 
Нет
Сравнивать double переменные (а в Qlua все числовые переменные именно такие) следует с некоторой точностью
 
 Да хотябы вот
https://forum.quik.ru/forum10/topic1881/
 
сравнивать можно, но важно, чтобы тип у сравниваемых переменных был одинаковый.
Так как тип указан неявно, то может возникать ситуация сравнения числа с текстом.
поэтому при сравнении указывайте тип явно.
 
function ff1(dp)
for i=-8.8,-0.8 do
print(i.."/"..dp)
if dp==i then
print(dp)
end
end
end

ff1(-8.8)
-----------------------------
результат
-8.8/-8.8
-8.8
-7.8/-8.8
-6.8/-8.8
-5.8/-8.8
-4.8/-8.8
-3.8/-8.8
-2.8/-8.8
-1.8/-8.8
-0.8/-8.8
>Exit code: 0
Все работает правильно.
 
а если передать строку:
ff1(tostring(-8.8))
То получим:
------------------
-8.8/-8.8
-7.8/-8.8
-6.8/-8.8
-5.8/-8.8
-4.8/-8.8
-3.8/-8.8
-2.8/-8.8
-1.8/-8.8
-0.8/-8.8
>Exit code: 0
Т е строка -8.8 не равна числу -8.8. Это тоже правильная работа if .
 
Цитата
Николай Камынин написал:
ff1(-8.8)
Все работает правильно.

Вопрос был в другом  :wink:

Код
function ff1(dp)
  for i = -8.8, -0.8 do
    if dp == i then print(dp) end
  end
end

for param, value in pairs({-8.8, -7.8, -6.8, -5.8, -4.8, -3.8, -2.8, -1.8, -0.8}) do
  ff1(value)
end
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Старатель написал:
Цитата
Николай  Камынин   написал:
ff1(-8.8)
Все работает правильно.
Вопрос был в другом  
Код
   function   ff1 (dp)
   for  i  =   -  8.8 ,  -  0.8   do 
     if  dp  =  =  i  then   print (dp)  end 
   end 
 end 

 for  param, value  in  pairs({ -  8.8 ,  -  7.8 ,  -  6.8 ,  -  5.8 ,  -  4.8 ,  -  3.8 ,  -  2.8 ,  -  1.8 ,  -  0.8 })  do 
  ff1(value)
 end   
Я Вам про это и ответил.
В данном варианте Вам надо написать функцию так:
unction ff1(dp)
for i=-8.8,-0.8 do
print(i.."/"..dp)
if string(dp)==string(i) then print(dp) end
end
end
 
function ff1(dp)
for i=-8.8,-0.8 do
print(i.."/"..dp)
if tostring(dp)==tostring(i) then print(dp) end
end
end
 
Цитата
Николай Камынин написал:
tostring(dp)==tostring(i)
Это не надёжный способ сравнения чисел, т.к. при математических операциях над числами с плавающей точкой появляются разряды, которые tostring не опускает.

В примере стоит изменить шаг и сравнение с tostring перестаёт работать:
Код
function ff1(dp)
  for i = -8.8, -0.8, 0.1 do
    if tostring(dp) == tostring(i) then print(dp) end
  end
end
ff1(-0.8)
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
Николай Камынин написал:
Я Вам про это и ответил.
Это вы не мне ответили.
Собственно, ответ уже был дан:
Цитата
Sergey Gorokhov написал:
Все дело в типе данных DOUBLE сравнивать нужно с заданной точностью.

Если хотите сравнивать строки, то используйте string.format. Но вычисляться будет в десять раз дольше, чем с числами.
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: 1
Читают тему
Наверх