Подскажите как обрезать число типа float до 2х знаков после запятой SetSell пишет в таблицу число вот такое 1,1124432871741 и тп... надо обрезать до 2х знаков после запятой в библиотеке math ничего не нашел
Если Вы будете обрезать строку, string.sub(Название переменной,1,3) то Вам надо определять сколько позиций в целой части т е сначала найти позицию десятичной точки, потом вычислить с какой по какую позицию выделить подстроку. т е эта формула работает лишь тогда когда у вас число меньше 2, а если 10 или 100 то она не работает, надо изменять последнюю цифру. ---------------------- Поэтому универсально работает это: y=string.sub(x,1,string.find(x,'.')+3) -- следующая строка после сообщения Владимира.
nikolz написал: если 10 или 100 то она не работает, надо изменять последнюю цифру.
Правильно, последнюю цифру меняю в зависимости от количества символов. string.sub(Название переменной,1,3) - оставляет 3 символа, начиная с 1-го слева, включая запятую (точку). string.sub(Название переменной,1,5) - оставляет 5 символов, начиная с 1-го слева, включая запятую (точку).
Спасибо за y=string.sub(x,1,string.find(x,'.')+3).
В документации Lua5.1 указано, что a % b == a - math.floor(a/b)*b --------------------- отсюда получаем math.floor(a/b)*b=a - a%b ------------------------ очевидно Михаил, с сайта которого Вы списали формулу , просто взял эту формулу из документации на луа и выдал за собственное открытие.
function round(num,idp) --функция округления
if idp and num and type(num)=="number" and type(idp)=="number" then
local mult=10^(idp or 0)
local x=0
if num>=0 then
x=math.floor(num * mult + 0.5) / mult
else
x=math.ceil(num * mult - 0.5) / mult
end
if x==math.floor(x) then x=math.floor(x) end -- обрезка нуля
return x
else
return num
end
end
function round(num, idp)
-- Если num некорректное, вернуть как есть
if not num or type(num) ~= "number" then return num end
-- Если idp не указан, использовать 0 (округление до целого числа)
idp = idp or 0
local mult = 10^idp
-- Округление для любого числа
local rounded = math.floor(num * mult + 0.5) / mult
-- Если число целое, убрать .0
if rounded == math.floor(rounded) then
return math.floor(rounded)
end
return rounded
end
function round (num, idp)
-- Если num некорректное, вернуть как есть
if not num or type(num) ~ = "number" then return num end
-- Если idp не указан, использовать 0 (округление до целого числа)
idp = idp or 0
local mult = 10 ^idp
-- Округление для любого числа
local rounded = math.floor (num * mult + 0.5 ) / mult
-- Если число целое, убрать .0
if rounded = = math.floor (rounded) then
return math.floor (rounded)
end
return rounded
end
local rounded = math.floor (num * mult + 0.5 ) / mult для отрицательных чисел не корректно
Да действительно, есть особенности в самой функции math.floor, углубляться не стал, вернулся к варианту изложенному Kolossi, с двумя правилами, сделал просто более читаемым для себя. Спасибо за обсуждение. Казалось бы простая задача округления числа, а вариантов собралось с десяток.