простое сложение с 0.01

Страницы: 1
RSS
простое сложение с 0.01
 
Недавно стал программировать на LUA и столкнулся со странной проблемой, собственно она в коде:
Код
function OnInit() end

function main()   

a = 130.01
b = 130.02-0.01

if a==b then
message("a равно b")
else
message("a не равно b")
end

end

function OnStop() end

Вот это все я просто запускаю из QUIK. И получается 130,01 не равно 130,01, это как?
 
Цитата
Алексей написал:
Недавно стал программировать на LUA и столкнулся со странной проблемой, собственно она в коде:
Код
   function   OnInit ()  end 

 function   main ()   

a  =   130.01 
b  =   130.02  -  0.01 

 if  a =  = b  then 
 message ( "a равно b" )
 else 
 message ( "a не равно b" )
 end 

 end 

 function   OnStop ()  end   

Вот это все я просто запускаю из QUIK. И получается 130,01 не равно 130,01, это как?

Это плавающая точка:

Код
>> a = 130.01

a =

  130.0100

>> b = 130.02-0.01

b =

  130.0100

>> a-b

ans =

  -2.8422e-14
 
Алексей,

Выход 1:
Код
>> a = 130.01

a =

  130.0100

>> b = 130.02-0.01

b =

  130.0100

>> bb = floor(b*100)/100

bb =

  130.0100

>> a-b

ans =

  -2.8422e-14

>> a-bb

ans =

     0

>> a==bb

ans =

     1


Выход 2:
Код
>> a-b<0.01

ans =

     1
 
валерий, огромное спасибо за столь развернутый ответ!
 
Выход:
Код
math.abs(a - b) < delta

тогда числа равны.
 
Constantin,

Ага - abs(), я как всегда небрежен. Спасибо за уточнение.
 
Все равно ничего не получается (
Вот например тут я прибавляю 0.1:
a = 143.45
b = math.floor((a*100)+10)/100
c = 143.55

В этом случае b не равно с. Если работаем с числами 123.45 и 123.55, то все работает. Умножаем на 1000 - работает. А будет ли оно со всеми числами работать, не могу понять ((
abs(a-с) так же не работает со всеми числами с плавающей точкой.

Есть ли способ гарантированной работы с этими числами?
 
Цитата
Алексей написал:
a = 143.45
b = math.floor((a*100)+10)/100
c = 143.55
b = (math.floor(a*1000)+100)/1000
 
b = math.floor((a*1000)+100)/1000
 
Цитата
Алексей написал:
Есть ли способ гарантированной работы с этими числами?
Наверное так:
Код
function NumEq(a, b)
    return math.abs(a - b) < 0.000001 -- Или использовать другое значение дельты?
end


a = 143.45 
b = a + 0.1

if NumEq(a, b) then

else

end
Страницы: 1
Читают тему
Наверх