Lua中保留小数点后两位数的四舍五入

我想要显示我的总经验值的百分比并保留小数点后两位数。我已经想出了一种解决方案,但它相当笨重。一定有更好的方法。

这是我目前的方案:

local xpPercentage = (((UnitXP("player") / UnitXPMax("player"))*100))
-- 63.4587392473
local xpMantissa = xpPercentage - floor(xpPercentage)
-- .4587392473
local xpTwoDec = (floor(xpMantissa * 100)/100) + floor(xpPercentage)
-- 63.45

这个方案虽然能够实现我的需求,但是有没有更加优美的方式呢?

点赞
用户4984564
用户4984564
local formatted = string.format(
   "%.2f %%",
   UnitXP('player') / UnitXPMax('player') * 100
)

那是Lua的标准方式,你也应该能用。 除非魔兽世界已经删除了这个函数,那样就很愚蠢了。

请注意,type(formatted)是字符串,而不是数字。


string.format 如在手册中所述,需要一个格式化字符串作为第一个参数,然后是一系列要插入格式化字符串中的值。

格式化字符串通常会按字面值处理,除了以 % 开头的特殊标记。附加参数的数量应与格式化字符串中这些标记的数量相等。

在上面的示例中,%f表示“在这里插入一个浮点数”;例如,string.format("hello %f world", 5.1")将返回“hello 5.1 world”。在 %f 之间添加文字,可以告诉它如何精确地格式化。

以下是使用所有选项的示例:string.format("%x6.2f", 2.264)

从左到右:

  • %标记开始
  • x告诉它用_x_ 填充右侧
  • 6告诉它整个长度应为5个字符长
  • .2告诉它四舍五入(或填充0),精确到2个小数位

因此,结果将是 xx2.26

最后,由于格式化字符串中的%具有特殊含义,如果要得到一个字面上的百分号,您必须使用 %%

"%.2f %%" 的含义是:

一个浮点数,精确到2位小数,后跟一个空格和一个百分号。因此,format 的第二个参数必须是一个数字,否则该函数将出错。

2019-09-16 06:33:54
用户2523387
用户2523387

已经有一个很好的答案了,但我不确定为什么你要提取尾数,只需对整数执行与尾数相同的操作:乘以100,四舍五入(或取整),然后除以100。

如果有帮助的话,你也可以将其视为:除以0.01(你想要的精度),然后四舍五入,然后再乘以0.01。

Lua没有四舍五入,但要使用floor作为舍入函数,只需使用floor(x + 0.5)。

尽管在级别的百分比方面,您可能仍然更喜欢取整,因为显示0.995为100%将会是误导的。

2019-09-17 05:49:50
用户16184778
用户16184778

以下是一个灵活的函数,可以将数字四舍五入到不同的位数。我测试过负数、大数、小数和各种边缘情况,它非常有用和可靠:

function Round(num, dp)
    --[[
    将数字四舍五入到指定小数位数,可以是负数,
    例如:-1 位将数字四舍五入到 10 位,

    示例:
        将 173.2562 四舍五入到 0 位小数是 173.0
        将 173.2562 四舍五入到 2 位小数是 173.26
        将 173.2562 四舍五入到 -1 位小数是 170.0
    ]]--
    local mult = 10^(dp or 0)
    return math.floor(num * mult + 0.5)/mult
end
2021-06-10 08:46:29