Вопрос по ЛУА (округление)

Страницы: 1
RSS
Вопрос по ЛУА (округление)
 
Здравствуйте!
Довольно чайниковский вопрос, но разобраться не могу.
Возникает проблема со сравнением двух чисел и арифметическими операциями.
Есть цена из стакана qt.bid[i].price=91.702700. И есть цена current_order_price_buy=91.7027 (визуально совпадают)
Однако их сравнение tonumber(qt.bid[i].price)==tonumber(current_order_price_buy) не происходит! При этом разность этих чисел равна diff=-1.4210854715202e-014
Как сделать так, чтобы они все же совпадали, т е какими видятся, такими были и фактически.

Спасибо
 
А если умножать оба числа на 10000 перед сравнением ?
 
самое простое - убрать нули справа
 
И кстати значение current_order_price_buy=91.7027 откуда берется? Если в результате какой-то арифметической операции, то разряды. дающие разницу между этими переменными, могут быть просто не видны, т.к. больше 6 разрядов после точки не отображается.
 
Цитата
Дмитрий пишет:
А если умножать оба числа на 10000 перед сравнением ?
Это делал
math.floor((math.floor(tonumber(qt.bid[i].price)*PRICE_SCALE)/PRICE_SCALE
В итоге получается число меньше: вместо 91.7027 получилось 91.7026
 
Цитата
Дмитрий пишет:
И кстати значение current_order_price_buy=91.7027 откуда берется? Если в результате какой-то арифметической операции, то разряды. дающие разницу между этими переменными, могут быть просто не видны, т.к. больше 6 разрядов после точки не отображается.
Да, Вы верно говорите, мне кажется все дело именно в это переменной. А как просто взять и обрубить эти разряды?
 
*PRICE_SCALE - это правильно. А зачем потом делить на эту же величину?
Лучше умножить на нее current_order_price_buy
 
Можно вместо tonumber(qt.bid[i].price)==tonumber(current_order_price_buy) попробовать написать
qt.bid[i].price == tostring(current_order_price_buy)
 
Так наверное будет лучше:
Код
math.floor(qt.bid[i].price*PRICE_SCALE) == math.floor(current_order_price_buy*PRICE_SCALE)

 
 
Цитата
Максим пишет:
Здравствуйте!
Довольно чайниковский вопрос, но разобраться не могу.
Возникает проблема со сравнением двух чисел и арифметическими операциями.
Есть цена из стакана qt.bid.price=91.702700. И есть цена current_order_price_buy=91.7027 (визуально совпадают)
Однако их сравнение tonumber(qt.bid.price)==tonumber(current_order_price_buy) не происходит! При этом разность этих чисел равна diff=-1.4210854715202e-014
Как сделать так, чтобы они все же совпадали, т е какими видятся, такими были и фактически.

Спасибо
Вот, например, как правильно сравнивать числа с плавающей точкой
 
Цитата
Дмитрий пишет:
Можно вместо tonumber(qt.bid.price)==tonumber(current_order_price_buy) попробовать написать
qt.bid.price == tostring(current_order_price_buy)
Так тоже не проходит. нужно отрубить все разряды вплоть до 4-го после запятой
 
Тогда Вам поможет следующий вариант, уже написанный мною выше:
math.floor(qt.bid[i].price*PRICE_SCALE) == math.floor(current_order_price_buy*PRICE_SCALE)
или правильней так, чтобы округление было по правилам математики, а не просто отсечение дробной части:
math.floor(qt.bid[i].price*PRICE_SCALE) == math.floor(current_order_price_buy*PRICE_SCALE + 0.5)

Michael Bulychev, подскажите, пожалуйста, а отдельной функции округления по правилам математики в Lua нет?
 
Выражение даже можно упростить:
qt.bid[i].price*PRICE_SCALE == math.floor(current_order_price_buy*PRICE_SCALE + 0.5)
 
Цитата
Дмитрий пишет:
Выражение даже можно упростить:
qt.bid.price*PRICE_SCALE == math.floor(current_order_price_buy*PRICE_SCALE + 0.5)


Дмитрий, для сравнения это подойдет, но потом нужно делать арифметические операции, и вновь эта проблема всплывет.
Я тут нашел функцию:

math.modf (x)
Возвращает два числа, Целую чать x и дробную часть x.

Как она возвращает дробную часть - я не совсем понял, но целую часть она возвращает хорошо). Если теперь записать так:
math.modf(qt.bid[i].price*PRICE_SCALE)/PRICE_SCALE==math.modf(current_order_price_buy*PRICE_SCALE)/PRICE_SCALE

то числа будут совпадать.
 
Цитата
Максим пишет:
но потом нужно делать арифметические операции, и вновь эта проблема всплывет
А что мешает делать эти операции с исходными числами, без всяких преобразований?
 
А то, какие выражения вы используете при сравнении этих чисел, никак не повлияет на Ваши дальнейшие вычисления, так как значения этих чисел в результате сравнения все равно не изменятся.
 
Цитата
Дмитрий пишет:
Цитата
Максим пишет:
но потом нужно делать арифметические операции, и вновь эта проблема всплывет
А что мешает делать эти операции с исходными числами, без всяких преобразований?
Мне нужно оценить, отличатся ли цена на шаг цены или более. Шаг цены 0.0001. допустим идет сравнение по разности текщей цены и текущего бида в стакане. Дополнительные разряды искажают инфу.  
 
 
Цитата
Дмитрий пишет:
А то, какие выражения вы используете при сравнении этих чисел, никак не повлияет на Ваши дальнейшие вычисления, так как значения этих чисел в результате сравнения все равно не изменятся.
Значения не изменятся, но мне нужно чтобы сами числа были такие, какие я для себя вижу, без дополнительных значений в n-цатом разряде.
 
Как вариант:
Код
local nul = 0.000000001
if math.abs(a - b) < nul then print('a == b') else print('a ~= b') end
или
Код
if math.abs(a - b) < PriceStep*0.1 then print('a == b') else print('a ~= b') end
Надо делать так, как надо. А как не надо - делать не надо.
Страницы: 1
Читают тему
Наверх