web-dev-qa-db-fra.com

Lua: conversion de float en int

Même si Lua ne fait pas de différence entre les nombres à virgule flottante et les entiers, il existe certains cas où vous souhaitez utiliser des entiers. Quelle est la meilleure façon de convertir un nombre en un entier si vous ne pouvez pas faire un cast de type C ou sans quelque chose comme int de Python?

Par exemple, lors du calcul d'un index pour un tableau dans

idx = position/largeur

comment pouvez-vous vous assurer que idx est un index de tableau valide? J'ai trouvé une solution qui utilise string.find, mais il existe peut-être une méthode utilisant l'arithmétique qui serait évidemment beaucoup plus rapide. Ma solution:

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
28
ddk

Vous pouvez utiliser math.floor(x)

Extrait du Manuel de référence Lua :

Renvoie le plus grand entier inférieur ou égal à x.

48
Hofstad

Lua 5.3 a introduit un nouvel opérateur, appelé floor division et désigné par //

Exemple ci-dessous:

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

> 12 // 5

2

Plus d'informations peuvent être trouvées dans le manuel lua

7
Chaojun Zhong

@Hofstad est correct avec la suggestion math.floor(Number x) pour éliminer les bits à droite de la décimale, vous voudrez peut-être arrondir à la place. Il n'y a pas de math.round, Mais c'est aussi simple que math.floor(x + 0.5). La raison pour laquelle vous voulez arrondir est que les flottants sont généralement approximatifs. Par exemple, 1 Pourrait être 0.999999996

12,4 + 0,5 = 12,9, plancher 12

12,5 + 0,5 = 13, plancher 13

12,6 + 0,5 = 13,1, plancher 13

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

pourquoi ne pas simplement utiliser math.floor()? cela rendrait les indices valides tant que le numérateur et le dénominateur sont non négatifs et dans des fourchettes valides.

2
Necrolis