Jonas^ Posted August 24, 2018 Share Posted August 24, 2018 (edited) Olá, bom eu tenho um sistema de rank, e nele tem o redutor de casas decimais fazendo uma divisão de kills pelas deaths alguns resultados ele aumenta o valor em 1 na última casa como mostra a print abaixo. Como podemos ver o jogador 1° da lista tem Kills: 12158 Deaths: 7869 Valor inteiro da divisão: 1.545050197 Então o K/D deveria ser: 1.54 Mas, o redutor seta como 1.55 OBS: O redutor esta definido para contar apenas 3 casas ou seja seria as 3 primeiras da divisão Alguém sabe me dizer se isso é uma falha? ou é normal com valores alto o redutor aplicar 1 kdr na última casa a mais em cada jogador. Na real isso só acontece com números grandes de kills e deaths no exemplo abaixo setei kills e deaths em mim e ele deu o valor exato da divisão. Como pode ver ele da o valor exato quando não é números muito grande: Valor inteiro da divisão: 2.6513157895 OBS: As vezes ele seta 1 na última casa até em divisão de números pequenos. 403 ÷ 152 = 2.65 valor exato reduzido pelo script Edited August 24, 2018 by OverKILL Link to comment
Other Languages Moderators Lord Henry Posted August 24, 2018 Other Languages Moderators Share Posted August 24, 2018 (edited) Mostre a parte do script onde o redutor é chamado pelo código e a função do redutor. Edited August 24, 2018 by Lord Henry Link to comment
Jonas^ Posted August 24, 2018 Author Share Posted August 24, 2018 (edited) 2 hours ago, Lord Henry said: Mostre a parte do script onde o redutor é chamado pelo código e a função do redutor. Em relação a parte do script, eu testei na sua tabela de testes de rank e nele também contém o erro, segue a print abaixo: Parte em que a função é chamada: CLIENT-SIDE function scoreInfo (accounts, kills, deaths, ratio) guiSetVisible (scoreWindow, true) guiSetVisible (closeGrid, true) showCursor (true) if accounts then for i, v in ipairs (accounts) do guiGridListAddRow (scoreGrid, accounts[i], kills[i], deaths[i], math.round(tonumber(ratio[i]), 2)) end end end addEvent ("showRank", true) addEventHandler ("showRank", getRootElement(), scoreInfo) SERVE-SIDE function recebeKills () local data = getAccounts () local accTable = {} local killsTable = {} local deathsTable = {} local killDeath = {} local kill = 0 local death = 0 if not data[1] then triggerClientEvent (client, "showScores", client) return end for i, acc in ipairs (data) do table.insert (accTable, getAccountName (data[i])) if not getAccountData (data[i], "kills") then table.insert (killsTable, "0") kill = 0 else table.insert (killsTable, tostring (getAccountData (data[i], "kills"))) kill = tonumber (getAccountData (data[i], "kills")) end if not getAccountData (data[i], "deaths") then table.insert (deathsTable, "0") death = 0 else table.insert (deathsTable, tostring (getAccountData (data[i], "deaths"))) death = tonumber (getAccountData (data[i], "deaths")) end local ratio = kill / death if death == 0 and kill == 0 then -- Se ambos os valores forem 0, deixa o ratio em 0 também. table.insert (killDeath, 0) elseif kill ~= 0 and death == 0 then -- Se death for 0 mas kill não, deixa o ratio como desconhecido, pois não é possível dividir algo por 0. table.insert (killDeath, "?") else -- Se nenhum valor for 0, faz a divisão normalmente e aplica o REDUTOR DECIMAL. table.insert (killDeath, ratio) end end triggerClientEvent (client, "showRank", client, accTable, killsTable, deathsTable, killDeath) end addEvent ("getRank", true) addEventHandler ("getRank", getRootElement(), recebeKills) Função: function math.round(number, decimals, method) if number and type(number) == "number" then decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end return 0 end Você não acha que isso pode ser uma falha desta função? Edited August 24, 2018 by OverKILL Link to comment
Other Languages Moderators Lord Henry Posted August 24, 2018 Other Languages Moderators Share Posted August 24, 2018 Sua função de redução está diferente da minha. Estou usando assim: function math.round (number, decimals, method) decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end E no código que está chamando o math.round, está faltando parâmetro como eu já havia mencionado da outra vez. -- Como está: math.round(tonumber(ratio[i]), 2) -- Como deve ser: math.round (tonumber(ratio[i]), 2, "floor") E a função só funciona direito client-side. 1 Link to comment
Jonas^ Posted August 24, 2018 Author Share Posted August 24, 2018 (edited) 9 minutes ago, Lord Henry said: Sua função de redução está diferente da minha. Estou usando assim: function math.round (number, decimals, method) decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end E no código que está chamando o math.round, está faltando parâmetro como eu já havia mencionado da outra vez. -- Como está: math.round(tonumber(ratio[i]), 2) -- Como deve ser: math.round (tonumber(ratio[i]), 2, "floor") E a função só funciona direito client-side. Sim claro, é client-side, mas só uma pergunta, esse '' floor '' o que significa? percebi que somente este floor faz a diferença, queria saber o que ele faz, sobre a função estar diferente, tinha um warning nela, assim do jeito que ela esta corrige esse warning Edited August 24, 2018 by OverKILL Link to comment
Other Languages Moderators Lord Henry Posted August 24, 2018 Other Languages Moderators Share Posted August 24, 2018 (edited) O floor arredonda para baixo e o ceil arredonda para cima. No exemplo: Floor: 1.276813074565884 >> 1.270000000000000 >> 1.27 Ceil: 1.276813074565884 >> 1.280000000000000 >> 1.28 Se nenhum dos dois for declarado, ele arredonda para o mais próximo, por exemplo: 1.556 >> 1.56 1.555 >> 1.55 1.554 >> 1.55 Edited August 24, 2018 by Lord Henry 1 Link to comment
Jonas^ Posted August 24, 2018 Author Share Posted August 24, 2018 (edited) Entendi, então se eu não usar ceil ele vai entregar o valor arredondado para cima de qualquer forma? Então meu código ficou assim: kd = math.round( tonumber(kd), 2 ) Para kd = math.round( tonumber(kd), 2, "floor" ) SERVER-SIDE ratio = tostring( math.round( tonumber(ratio), 2 ) ) Para ratio = tostring( math.round( tonumber(ratio), 2, "floor" ) ) Esta parte do SERVER-SIDE é um comando que ao jogador digitar puxa os dados dele, inclusive o ratio então tem o redutor no lado server também. Perfeito agora ele esta arredondando certinho o valor: Edited August 24, 2018 by OverKILL Link to comment
Other Languages Moderators Lord Henry Posted August 24, 2018 Other Languages Moderators Share Posted August 24, 2018 Teste e descubra. Link to comment
Jonas^ Posted August 24, 2018 Author Share Posted August 24, 2018 2 minutes ago, Lord Henry said: Teste e descubra. Vlw aí pela ajuda, pensei que fosse um erro da função! Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now