如何处理 Lua 浮点数精度不足的问题

使用 Lua 处理浮点数时,我发现 Lua 的精度非常有限,例如:

print(3.14159265358979)

输出为:

3.1415926535898

结果会丢失几个小数位,从而导致计算偏差。我该如何处理这种精度不足的问题?

原文链接 https://stackoverflow.com/questions/69819124

点赞
stackoverflow用户3574628
stackoverflow用户3574628

默认情况下,Lua只显示数字的前14位。一个float可能需要15到17个数字以十进制表示方式完全呈现。我们可以使用循环来找到正确位数的数字。请注意,%g将会省略尾随的零,所以我们可以从15位数开始搜索,而不是1。这是我使用的函数:

local function floatToString(x)
  for precision = 15, 17 do
    -- 使用两层格式尝试使用不同的精度来表示数字.
    local s <const> = ('%%.%dg'):format(precision):format(x)
    -- 查看s是否是x的准确表示.
    if tonumber(s) == x then
      return s
    end
  end
end

print(floatToString(3.14159265358979))

输出: 3.14159265358979

2021-11-03 15:04:10