Jump to content

DÚVIDA REDUTOR


Recommended Posts

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.

 

tTNwkVJ.png

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.

XuWVIgQ.png

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 by OverKILL
Link to comment
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:

gwUncyv.png

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 by OverKILL
Link to comment
  • Other Languages Moderators

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.

  • Thanks 1
Link to comment
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 by OverKILL
Link to comment
  • Other Languages Moderators

O floor arredonda para baixo e o ceil arredonda para cima.

jxhco-__TvuYES18AIrGAA.png

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 by Lord Henry
  • Thanks 1
Link to comment

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 by OverKILL
Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...