Проблема вычисления выражений с дробными числами

Страницы: 1
RSS
Проблема вычисления выражений с дробными числами, message(''..1.100-1.099) -----> 0.0010000000000001
 
Здравствуйте.

Запускаю простейший скрипт:

message(''..1.100-1.099)  -----> 0.0010000000000001

Как так? Большое недоумение у меня...
 
Цитата
Igor Ankudinov написал:
Здравствуйте.

Запускаю простейший скрипт:

message(''..1.100-1.099)  -----> 0.0010000000000001

Как так? Большое недоумение у меня...
комп исчисляет в двоичной
чел - в десятичной
из десятичной в двоичную и обратно не всегда можно точно.
вот и получаем приближенно.
-----------------------
 
чтобы было точно надо исчислять в двоично-десятичном формате.
 
Смысл написанного Вами понятен.
Имею опыт программирования на других языках, и там как-то интерпретатор /компилятор справляются...
Какое типовое решение используется для "обхода" данной фичи, можете подсказать?
Речь идет об манипуляциях с bid и offer полученными через tonumber(getParamEx(class,sec,'bid ').param_value)  и имеющих 4 знака после запятой
 
Ничего умнее не придумал для округления до 4 знаков:
math.floor(num * 10000+ 0.5) / 10000

Только жалко время на расчеты тратится..
 
Цитата
Игорь написал:
Ничего умнее не придумал для округления до 4 знаков:
math.floor(num * 10000+ 0.5) / 10000

Только жалко время на расчеты тратится..
с какой целью Вы это делаете?
В исходном варианте у Вас погрешность 0.0000000000000001
а в вашем - погрешность 0.00005 т е в 10000000000 раз больше.
Оно Вам надо?
----------------------
Вам "шашечки" или ехать?
 
Мне нужно чтобы выражения типа 1.0872-1.0871 давали точно 0.0001
0.5 добавляется на случай если выражение 1.0872-1.0871 вернет результат 0.00009999999999999999
 
Цитата
Игорь написал:
Имею опыт программирования на других языках, и там как-то интерпретатор /компилятор справляются...
Нигде не справляются, это фича чисел с плавающей точкой. На тех же сях то же самое, там просто в pfintf/sprintf/etc по дефолту режется до (не более чем) 6 знаков после запятой тем же способом, что вы привели, поэтому на первый взгляд кажется, что все точно. Посмотрите в интернетах, целые статьи как два дабла сравнить чтобы не было мучительно больно. Если нужно перфекционизьму, надо с ценами работать с фиксированной точкой, но в луа целых вычислений нет как таковых, так что ваш вариант вполне себе оптимальный (только не учитывает возможность отрицательного аргумента, в этом случае не в ту сторону округлите). О лишних вычислениях переживать незачем, там столько оверхеда по другим поводам, что это вообще никак не повлияет, даже если глубоко в цикл вложить.
 
Цитата
Игорь написал:
Ничего умнее не придумал для округления до 4 знаков:
math.floor(num * 10000+ 0.5) / 10000

Только жалко время на расчеты тратится..
так будет быстрее:
0.0001*math.floor(num * 10000+ 0.5)  
Страницы: 1
Читают тему
Наверх