【问题标题】:Lua: Perfectly Truncate a ValueLua:完美截断一个值
【发布时间】:2014-09-29 03:13:15
【问题描述】:

此脚本在程序中显示一个值:

string.format("%d", math.floor(self:value())) -- Where self:value() is a number like 4.1256913947

此脚本采用相同的值并将其打印到我的控制台。

math.floor(value) -- Where value is the same number as self:value() was...it's just being sent to another function as well

问题是显示值和控制台打印的值不匹配。这种情况很少发生,而且很少发生,但是当用户输入的数据略微超过整数(即 4.0029893417)或其他任何情况时,它会无缘无故地将其降至 3。我试过math.ceil,但是当它关​​闭时会发生相反的效果(即4.89898989)它打印5但显示4。有没有办法让它完全截断数字?从而正确显示并正确打印?

注意:该值是不可更改的,因为有时这些额外的小数需要存在并在其他地方/功能中相应地处理。

谢谢:)

【问题讨论】:

标签: string math lua truncate floor


【解决方案1】:

出于好奇,我使用您描述的一些条件进行了一些测试。不幸的是(或幸运的是)我无法重现您所说的问题。 下面的sn-p加减随机数,使结果在4左右,然后比较两种打印方式(按产生的字符串比较):

for i=1,10000000 do
    local value = 3.9 + math.random() * 0.2
    local s1 = string.format("%d", math.floor(value))
    local s2 = tostring(math.floor(value))
    if s1 ~= s2 then print "Error" end
end

您可以猜到,“错误”没有出现。

我又做了一个实验:

local l = 4
for i=1,100000 do
    local k = math.pow(10,-i)
    local rand = math.random() * 0.1
    local subtracted = l - k - rand
    if math.floor(subtracted + k + rand) < 4 then
        print "error"
    end
end

通过添加非常小的数字,我希望得到与您描述的结果相似的结果,但同样,问题没有出现。

所以我必须得出结论,问题可能在于函数 self:value() 和变量 value 之间的差异(它们有时确实有不同的值)。

【讨论】:

  • 正如其他人也指出的那样,是另一个部分导致了问题。显然,在我之前的人忘记告诉我还有另一个脚本或部分覆盖了显示中的相同值,因此显示在一定程度上是“不准确的”。调用该函数时要考虑到原始函数(即 string.format(%d math.floored 等)和这一行(与值混淆)...string.format("%." .. math.abs(math.ceil(-math.log(self._step) / math.log(10))) .. "f", self:value()) 如您所见,这将使值显示稍微偏离(至少,我认为)
  • 所以我在 self._step 上添加了一个检查是否是一个整数(其中只有一个值,1 或者是其他任何东西......使用更长的版本字符串。到目前为止它有效,但如果有人愿意尝试验证或查看这是否确实是问题,那将不胜感激。我对日志不是很好,而不是 Lua 如何处理它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-21
  • 2013-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
相关资源
最近更新 更多