WoW - 在 Lua 中四舍五入到小数点后两位
WoW - rounding to two decimal places in 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
同样,这符合我的要求,但是有没有更漂亮的方法呢?
local formatted = string.format(
"%.2f %%",
UnitXP('player') / UnitXPMax('player') * 100
)
这是标准的 Lua 方法,应该也适合您。
除非 WoW 删除了该功能,否则会很愚蠢。
请注意 type(formatted)
是字符串,而不是数字。
string.format
,如manual中所述,将格式字符串作为其第一个参数,后跟一系列要拼接成格式字符串的值。
除了以 %
开头的特殊标记外,格式字符串将主要按字面意思处理。附加参数的数量应等于格式字符串中这些标记的数量。
在上面的例子中,%f
表示"insert a float here";例如,string.format("hello %f world", 5.1")
将 return "hello 5.1 world"。在 %
之后和 f
之前添加内容,您可以告诉它如何准确地格式化它。
这是一个使用所有选项的示例:string.format("%x6.2f", 2.264)
从左到右:
%
标记开始
x
告诉它用 xs 向右填充
6
告诉它整个东西应该是 5 个字符长
.2
告诉它舍入(或用 0 填充)到小数点后两位
因此,结果将是 xx2.26
最后,由于 %
在格式字符串中具有特殊含义,如果您想要文字 % 则必须改为 %%
。
"%.2f %%" 因此表示:
一个浮点数,四舍五入或填充到 2 位小数,后跟一个 space 和一个百分号。 format
的第二个参数必须是数字,否则函数会出错。
已经有一个很好的答案,但我不确定你为什么要提取尾数,只需对整数执行你对尾数所做的操作:乘以 100,正常舍入(或底数),然后除100.
如果有帮助,您也可以这样查看和编写:除以 0.01(您想要的精度)然后舍入,然后再次乘以 0.01。
Lua 没有舍入,但要使用 floor 作为舍入函数,只需使用 floor( x + 0.5 )
尽管使用水平百分比,您可能还是更喜欢下限,因为将 0.995 显示为 100% 会产生误导。
这里有一个灵活的函数可以四舍五入到不同的位数。我用负数、大数、小数和各种边缘情况对其进行了测试,它非常有用且可靠:
function Round(num, dp)
--[[
round a number to so-many decimal of places, which can be negative,
e.g. -1 places rounds to 10's,
examples
173.2562 rounded to 0 dps is 173.0
173.2562 rounded to 2 dps is 173.26
173.2562 rounded to -1 dps is 170.0
]]--
local mult = 10^(dp or 0)
return math.floor(num * mult + 0.5)/mult
end
我正在尝试将我的总经验值显示为四舍五入到小数点后两位的百分比。我想出了一个解决方案,但它很笨重。一定有更好的方法。
这是我的资料:
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
同样,这符合我的要求,但是有没有更漂亮的方法呢?
local formatted = string.format(
"%.2f %%",
UnitXP('player') / UnitXPMax('player') * 100
)
这是标准的 Lua 方法,应该也适合您。 除非 WoW 删除了该功能,否则会很愚蠢。
请注意 type(formatted)
是字符串,而不是数字。
string.format
,如manual中所述,将格式字符串作为其第一个参数,后跟一系列要拼接成格式字符串的值。
除了以 %
开头的特殊标记外,格式字符串将主要按字面意思处理。附加参数的数量应等于格式字符串中这些标记的数量。
在上面的例子中,%f
表示"insert a float here";例如,string.format("hello %f world", 5.1")
将 return "hello 5.1 world"。在 %
之后和 f
之前添加内容,您可以告诉它如何准确地格式化它。
这是一个使用所有选项的示例:string.format("%x6.2f", 2.264)
从左到右:
%
标记开始x
告诉它用 xs 向右填充
6
告诉它整个东西应该是 5 个字符长.2
告诉它舍入(或用 0 填充)到小数点后两位
因此,结果将是 xx2.26
最后,由于 %
在格式字符串中具有特殊含义,如果您想要文字 % 则必须改为 %%
。
"%.2f %%" 因此表示:
一个浮点数,四舍五入或填充到 2 位小数,后跟一个 space 和一个百分号。 format
的第二个参数必须是数字,否则函数会出错。
已经有一个很好的答案,但我不确定你为什么要提取尾数,只需对整数执行你对尾数所做的操作:乘以 100,正常舍入(或底数),然后除100.
如果有帮助,您也可以这样查看和编写:除以 0.01(您想要的精度)然后舍入,然后再次乘以 0.01。
Lua 没有舍入,但要使用 floor 作为舍入函数,只需使用 floor( x + 0.5 )
尽管使用水平百分比,您可能还是更喜欢下限,因为将 0.995 显示为 100% 会产生误导。
这里有一个灵活的函数可以四舍五入到不同的位数。我用负数、大数、小数和各种边缘情况对其进行了测试,它非常有用且可靠:
function Round(num, dp)
--[[
round a number to so-many decimal of places, which can be negative,
e.g. -1 places rounds to 10's,
examples
173.2562 rounded to 0 dps is 173.0
173.2562 rounded to 2 dps is 173.26
173.2562 rounded to -1 dps is 170.0
]]--
local mult = 10^(dp or 0)
return math.floor(num * mult + 0.5)/mult
end