【问题标题】:Test if Lua number is integer or float测试 Lua 数是整数还是浮点数
【发布时间】:2014-10-01 11:50:22
【问题描述】:

在我的 C++ 程序中,我需要知道 Lua 变量是整数还是浮点数。 C API 提供了lua_isnumber(),但是这个函数不区分int/float/double

到目前为止,我已经使用modf() 解决了这个问题:

if (lua_isnumber(luaCtx, -1)) // int / unsigned int / float:
{
    luaVarName = lua_tostring(luaCtx, -2);
    double n = static_cast<double>(lua_tonumber(luaCtx, -1));

    // Figure out if int or float:
    double fractPart, intPart;
    fractPart = modf(n, &intPart);

    if (fractPart != 0.0)
    {
        luaVarType = ScriptVar::TypeTag::Float;
        luaVarData.asFloat = static_cast<float>(n);
    }
    else
    {
        luaVarType = ScriptVar::TypeTag::Integer;
        luaVarData.asInteger = static_cast<int>(n);
    }
}

Lua API 是否提供了一种更精确地推断变量类型的方法?

【问题讨论】:

  • 不。您可以使用lua_tounsignedlua_checkunsigned 将其转换为无符号类型。否则你必须像你一样投射它。
  • Lua 5.3 将同时具有整数和浮点类型。

标签: c++ lua lua-api


【解决方案1】:
double n = lua_tonumber(L, -1);
if (n == (int)n) {
    // n is an int
} else {
    // n is a double
}

这段代码所做的只是检查 n 是否有小数。 如果 n 为 1.5,则将其转换为 int ((int)n) 会将值设为 1,因此:

1.5 == 1 为假,n 为双精度

但如果 n 是 4:

4 == 4 为真,n 为整数

这是可行的,因为对于 lua,唯一存在的数字是双精度数。所以在将一个数字从lua转换为C时,如果数字是整数(整数),我们可以选择使用int。

【讨论】:

  • 此答案已删除。很难说这是否是一个高质量的答案。你能解释一下吗?
  • 好的,所以没有关于数字的额外信息,您必须自己检查。使用类型转换/floor() 等很容易。
猜你喜欢
  • 2019-04-16
  • 2016-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 2012-05-12
  • 2011-04-22
相关资源
最近更新 更多