WoW - округление до двух десятичных знаков в 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

Опять же, это то, что я хочу, но есть ли способ сделать это лучше?


person BWayne    schedule 16.09.2019    source источник


Ответы (3)


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

Это стандартный способ Lua, который также должен сработать для вас. Если бы WoW не удалил эту функцию, это было бы глупо.

Обратите внимание, что 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 s
  • 6 говорит, что все должно состоять из 5 символов
  • .2 сообщает ему округлить (или дополнить нулями) до 2 знаков после запятой

Итак, результат будет xx2.26

Наконец, поскольку % имеет особое значение в строке формата, если вам нужен буквальный%, вы должны вместо этого написать %%.

Таким образом, "% .2f %%" означает:

Число с плавающей запятой, округленное или дополненное до 2 десятичных знаков, за которым следует пробел и знак процента. Второй аргумент format должен быть числом, иначе функция выдаст ошибку.

person DarkWiiPlayer    schedule 16.09.2019
comment
Все хорошие ответы. Спасибо всем. Я новичок в Lua, поэтому я все еще работаю над изучением этого вопроса прямо в голове. В качестве бонуса, не могли бы вы объяснить мне синтаксис% .2f %%? - person BWayne; 17.09.2019
comment
@BWayne Конечно же;) - person DarkWiiPlayer; 17.09.2019
comment
Фантастика. Это очень полезно. Большое спасибо! - person BWayne; 17.09.2019

Вот гибкая функция для округления до разного количества мест. Я тестировал его с отрицательными числами, большими числами, маленькими числами и всевозможными крайними случаями, и он полезен и надежен:

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
person George Williams    schedule 10.06.2021

Уже есть хороший ответ, но я не уверен, зачем вы вообще извлекаете мантиссу, просто выполняйте то, что вы делаете с мантиссой для всего числа: умножьте на 100, округлите (или уменьшите) как обычно, затем разделите на 100.

Если это поможет, вы также можете просмотреть и записать это как: разделите на 0,01 (точность, которую вы хотите получить), затем округлите, а затем снова умножьте на 0,01.

В Lua нет round, но чтобы использовать floor как круглую функцию, просто используйте floor (x + 0,5)
Хотя с процентным соотношением уровней вы все равно можете предпочесть этаж, так как отображение 0,995 как 100% будет вводить в заблуждение.

person Nathanyel    schedule 17.09.2019
comment
делить на 0,01 умножение на 100 намного быстрее, по крайней мере, на бумаге (IRL они оба настолько быстрые, что вы не заметите разницы), и его также легче читать, поэтому я не вижу причин, почему вы ' d разделить на дробь - person DarkWiiPlayer; 17.09.2019
comment
Что ж, для компьютера это не имеет большого значения, я хотел намекнуть, что вы также можете использовать этот метод для других дробей, например до кратных 0,05 (швейцарская валюта исключила монеты меньше 5 Rappen = 0,05 Franken) или даже сумасшедших дробей, которые не являются дробями от 1, чтобы они округляли целые числа до нецелых. - person Nathanyel; 17.09.2019