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 y a des cas où vous voulez utiliser des entiers. Quelle est la meilleure façon de cacher un nombre à un entier si vous ne pouvez pas faire une distribution 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 peut-être qu'il y a une méthode qui utilise 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
27
demandé sur ddk 2012-03-11 15:24:05

4 réponses

Vous pouvez utiliser math.floor(x)

Du manuel de référence Lua :

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

43
répondu Hofstad 2012-03-11 12:12:47

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

Exemple de coups

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

>12//5

2

Plus d'informations peuvent être trouvées dans Lua reference

4
répondu Chaojun Zhong 2017-10-12 03:03:19

@Hofstad est correct avec la suggestion math.floor(Number x) pour éliminer les bits à droite de la décimale, vous pouvez arrondir à la place. Il n'y a pas de mathématiques.rond, mais il est aussi simple que math.floor(x + 0.5). La raison pour laquelle vous voulez arrondir est parce que les flotteurs sont généralement approximative. Par exemple, 1 peut être 0.999999996

12.4 + 0.5 = 12.9, parqueté 12

12.5 + 0.5 = 13, parqueté 13

12.6 + 0.5 = 13.1, parqueté 13

local round = function(a, prec)
    return math.floor(a + 0.5*prec) -- where prec is 10^n, starting at 0
end
3
répondu Cody 2017-01-16 13:06:09

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

2
répondu Necrolis 2012-03-11 12:15:32