Lua: преобразование из числа с плавающей точкой в ​​int - PullRequest
28 голосов
/ 11 марта 2012

Хотя Lua не делает различий между числами с плавающей запятой и целыми числами, в некоторых случаях вы хотите использовать целые числа.Каков наилучший способ преобразовать число в целое число, если вы не можете выполнить C-подобное приведение или без чего-либо вроде Python's 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

Ответы [ 4 ]

47 голосов
/ 11 марта 2012

Вы можете использовать math.floor(x)

Из справочного руководства Lua :

Возвращает наибольшее целое число, меньшее или равное x.

6 голосов
/ 12 октября 2017

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

Пример ниже:

Lua 5.3.1. Copyright (C) 1994-2015 Lua.org, PUC-Rio

> 12 // 5

2

Более подробную информацию можно найти в руководстве lua

6 голосов
/ 16 января 2017

@ 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
2 голосов
/ 11 марта 2012

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

...