Подтвердить что ты не робот

Lua: преобразование из float в int

Хотя Lua не различает числа с плавающей запятой и целые числа, есть некоторые случаи, когда вы хотите использовать целые числа. Каков наилучший способ скрыть число до целого числа, если вы не можете сделать C-подобный прилив или что-то вроде Python int?

Например, при вычислении индекса для массива в

idx = позиция/ширина

как вы можете гарантировать, что idx является допустимым индексом массива? Я придумал решение, которое использует string.find, но, возможно, есть метод, который использует арифметику, которая, очевидно, будет намного быстрее. Мое решение:

function toint(n)
    local s = tostring(n)
    local i, j = s:find('%.')
    if i then
        return tonumber(s:sub(1, i-1))
    else
        return n
    end
end
4b9b3361

Ответ 2

@Hofstad правильно с предложением math.floor(Number x), чтобы исключить биты справа от десятичной дроби, вы можете захотеть вместо этого округлить. Существует нет math.round, но это так же просто, как math.floor(x + 0.5). Причина, по которой вы хотите объединить, - это то, что поплавки обычно приблизительны. Например, 1 может быть 0.999999996

12,4 + 0,5 = 12,9, пол 12

12,5 + 0,5 = 13, пол 13

12,6 + 0,5 = 13,1, пол 13

local round = function(a, prec)
    return math.floor(a + 0.5*prec) -- where prec is 10^n, starting at 0
end

Ответ 3

почему бы просто не использовать math.floor()? это сделало бы индексы действительными до тех пор, пока числитель и знаменатель неотрицательны и в допустимых пределах.

Ответ 4

Lua 5.3 ввел новый оператор, называемый делением пола и обозначенный //

Примеры ударов

Lua 5.3.1 Авторское право (C) 1994-2015 Lua.org, PUC-Rio

<Р → 12//5

2

больше информации можно найти в ссылка lua