Como faço para determinar se um número é dentro de um percentual de outro número
-
19-09-2019 - |
Pergunta
Eu estou escrevendo código de iPhone que vagamente reconhece se uma linha swiped é straight-ish. Recebo a influência dos dois pontos finais e compará-lo com 0, 90, 180 e 270 graus com uma tolerância de 10 graus mais ou menos. Agora eu fazê-lo com um monte de se blocos, que parece super-pesado.
Como escrever uma função que, dado o
Update: eu sou, talvez, ser muito específico eu acho uma boa, função geral que determina se um número é dentro de um percentual de outro número tem utilidade em. muitas áreas.
Por exemplo: É o número swipeLength dentro de 10% de maxSwipe ? Isso seria útil.
BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
// dunno how to calculate
}
BOOL result;
float swipeLength1 = 303;
float swipeLength2 = 310;
float tolerance = 10.0; // from -5% to 5%
float maxSwipe = 320.0;
result = isNumberWithinPercentOfNumber(swipeLength1, tolerance, maxSwipe);
// result = NO
result = isNumberWithinPercentOfNumber(swipeLength2, tolerance, maxSwipe);
// result = YES
Você vê o que eu estou chegando?
Solução
20% como um decimal é igual a 0,2. Basta dividir por 100,0 para obter o decimal. Dividir por 2.0 para obter metade da faixa aceitável. (Combinados em 200,0 divisor)
A partir daí, somar e subtrair de 1,0 para obter o 90% e 110% os valores. Se o primeiro número está entre os intervalos, então, você tem isso.
BOOL isNumberWithinPercentOfNumber(float firstN, float percent, float secondN) {
float decimalPercent = percent / 200.0;
float highRange = secondN * (1.0 + decimalPercent);
float lowRange = secondN * (1.0 - decimalPercent);
return lowRange <= firstN && firstN <= highRange;
}
Nota: não há nenhuma verificação de erros aqui para NaN ou valores negativos. Você vai querer acrescentar que para o código de produção.
Update:. A make por cento, para incluir tanto +/- gama
Outras dicas
int AngularDistance (int angle, int targetAngle)
{
int diff = 0;
diff = abs(targetAngle - angle)
if (diff > 180) diff = 360 - diff;
return diff;
}
Isso deve funcionar para quaisquer dois ângulos.
Resposta à sua refinada nova pergunta /:
bool isNumberWithinPercentOfNumber (float n1, float percentage, float n2)
{
if (n2 == 0.0) //check for div by zero, may not be necessary for float
return false; //default for a target value of zero is false
else
return (percentage > abs(abs(n2 - n1)/n2)*100.0);
}
Para explicar, você tirar a diferença absoluta entre o teste eo valor-alvo, e dividi-lo pelo valor-alvo (as duas 'chamadas abs'olute certificar-se isso funciona com números de destino e de teste negativos também, mas não com percentuais negativos / tolerâncias). Isto dá a percentagem da diferença expressa como fracção decimal, multiplica-o com 100 para dar a expressão 'comum' de percentagem (10% = 0,10),