Вычитание из числа округленного до сотых числа округленного до сотых

Страницы: 1
RSS
Вычитание из числа округленного до сотых числа округленного до сотых, В скрипте две переменных, округленные до сотых. Из одной вычитается другая. Результаты математической операции ниже:
 
В скрипте две переменных, округленных до сотых. Из одной вычитается другая. Результаты математических операции ниже:
0.14999999999999
0.099999999999994
0.13000000000001
0.040000000000006
Видел похожую тему с 0.000000001, но в моем случае результаты еще интересней.
Подскажите каким образом получить нормальный результат?
 
Здравствуйте,
Это известная проблема с использованием типа данных с плавающей точкой.
Рекомендуем добавить функцию округления до заданной точности.
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Это известная проблема с использованием типа данных с плавающей точкой.
Рекомендуем добавить функцию округления до заданной точности.
Сергей, здравствуйте!
Собственно мой вопрос в этом и заключался. Каким образом это реализовать?
Прошу сильно не пинать, лучше если есть такая возможность - скиньте пример.
 
Отбой! Нашел, что нужно. Если кому понадобится решение то оно здесь https://quikluacsharp.ru/qlua-osnovy/matematicheskie-funktsii-v-qlua-lua/
 
Цитата
sav 312 написал:
В скрипте две переменных, округленных до сотых. Из одной вычитается другая. Результаты математических операции ниже:
0.14999999999999
Подскажите каким образом получить нормальный результат?
Никак. Даже если напрямую запишите значение 0.15, оно всё равно не будет точным:
Код
local x = 0.15
print(string.format("%.16g", x))
print(string.format("%.17g", x))
Вывод:
Код
0.15
0.14999999999999999
Потому что десятичные дроби не раскладываются точно на двоичные по законам математики.
 
Цитата
Suntor написал:
Вывод:Код0.15
0.14999999999999999Потому что десятичные дроби не раскладываются точно на двоичные по законам математики.
Вас понял. В моем случае все решается самописной функцией, которая округляет результат до сотых по "законам математики". Ссылка на решение выше. Спасибо всем кто откликнулся.
 
На просторах интернетов можно найти доп.модуль QL.LUA, в нём много различных вкусностей, которые помогают не изобретать велосипед, а использовать то, что уже давным давно написано. Скачиваете, подключаете в своем модуле (require "QL";), используете...
В частности из QL.LUA:
Код
function toScale(number,scale,dir)
   -- округление числа до scale вниз при dir==floor, вверх при dir==ceil или математическое при dir==nil
   if not dir then
      return math_floor((0.5*scale+number)/scale)*scale -- math rounding
   elseif dir=='floor' then
      return math_floor(number/scale)*scale  -- floor rounding
   elseif dir=='ceil' then   
      return math_ceil(number/scale)*scale  -- ceil rounding
   end
end
Страницы: 1
Читают тему
Наверх