2009-09-03 52 views
5

Antes de empezar a reír a una pregunta tan sencilla Me explico:El cálculo de la diferencia porcentual entre dos valores

Estoy tratando de determinar la cantidad de cambio (porcentaje%) existe en más de una cuenta diversos indicadores. Esto no es particularmente difícil. ¿Pero cómo manejas generalmente los casos donde el valor actual es cero o el valor anterior es cero?

es decir

Esta semana: Ganancias = $ 25,6

semana pasada: Ganancias = $ 0,0

que actualmente calculan la diferencia% por la siguiente fórmula:

If (CurrentValue > 0.0 && PreviousValue > 0.0) { 
    return (CurrentValue - PreviousValue)/PreviousValue; 
} return 0.0; 

si las ganancias fueron cero en la semana anterior - ¿Cuál debería ser la diferencia porcentual? + Infinity?
¿Y a la inversa si la semana actual es cero? -Infinity?

Entonces Para complicar las cosas ¿cómo manejar esta situación en una consulta LINQ a SQL

Upside_Earnings = (statistics.Where(d => d.DateTime > first_startdate && d.DateTime <= first_enddate).Average(e => (double)e.Earnings) > zero && 
            statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings) > zero) ? 
            ((statistics.Where(d => d.DateTime > first_startdate && d.DateTime <= first_enddate).Average(e => (double)e.Earnings) - 
            statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings))/
            statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings)) : zero, 
+0

Gracias por su ayuda chicos/chicas –

Respuesta

5

Lo que debe hacer en esa situación es subjetivo, y probablemente dependa de las necesidades de su negocio.

Preferiría No disponible si no hay otra opción.

100% puede tener sentido.

Quizás el uso de 1 en lugar de cero también tenga sentido, dando como resultado un 2560% en su ejemplo.

+0

Gran idea. 2560% es potencialmente más significativo para el usuario. Y permite que los distintos casos cero se clasifiquen entre sí. –

1

Recuerdo mis instructores llamándolo 'indefinido' en oposición al infinito.

De wikipedia:

División de cualquier número por cero (en el que el divisor es cero) no está definido. Esto es porque cero agregado a cero, no importa cuántas veces se repita la ecuación, siempre dará como resultado una suma de cero. La entrada de dicha ecuación en la mayoría de las calculadoras dará como resultado la emisión de un mensaje de error.

+0

Donde ambos valores son cero - estoy bastante contento con llamar a la diferencia cero. Es el caso donde uno de los valores es cero –

+0

Sí, estoy bastante seguro de que no está definido, x/0 no es infinito. – Davis

+0

Para fines de clasificación, creo que el infinito negativo y positivo es más intuitivo. –

3

Establece arbitrariamente% change en X donde X es el valor por defecto razonable para su espacio problemático. Sin embargo, no es realmente una pregunta de programación. Es una cuestión de lo que esperas. Lo que debería suceder cuando cualquier número se aproxima a cero es una función del espacio problemático. Por ejemplo, trabajé una vez en una "función" contable. La función no era nada especial, solo traducía un método de puntuación al código. El problema estaba en el método de puntuación y nadie había definido nunca cuáles eran los valores predeterminados, ya que algunos denominadores pasaban a cero. Para cualquier puntaje contable dado, lo que sucedió en cero podría ser puntos completos, puntos parciales o 0 puntos (en la escala de calificación) dependiendo de los detalles de lo que se estaba midiendo.

Determine lo que está midiendo y sustituya con un valor razonable por cero. Si está midiendo el rendimiento, asegúrese de que alguien no pueda jugar con el sistema al tener intencionalmente $ 0 semanas seguido de altas semanas de dólar (por ejemplo).

+0

buen punto, las estadísticas en mi caso no es probable que sufran ninguna alteración. –

1

Guardaría NaN o infinito, o cualquier valor que tenga sentido, pero cuando se muestre al usuario, dejaría el porcentaje en blanco o de alguna manera indicaría que un porcentaje no tiene sentido entonces.

+0

Sí, parece que este es el verdadero problema con mi pregunta, es una de las expectativas. ¿Qué espera el usuario cuando ordena la lista por diferencia de porcentaje? ¿Tendra sentido el infinito? o debería reducirlo a cero? –

0

Aunque técnicamente la respuesta es indefinida (en el caso $ 0/$ 0) o infinito/-infinito (en todos los demás casos) al humano no le va a gustar ninguna respuesta. Mostraría algo así como una o algo similar si no pudiera averiguar por los usuarios qué sería lo mejor para hacer aquí.

6

El cambio puede ser positivo o negativo. Así fórmula es:

var change = ((V2 - V1)/Math.Abs(V1)) * 100; 

Ejemplo:

  1. calcular el cambio porcentual de V1 = 110 a V2 = 220 (cambio positivo)

[((V2 - V1)/| V1 |) * 100]

= ((220 - 110)/| 110 |) * 100 = (110/110) * 100 = 1 * 100 = 100% de cambio

= 100% de aumento

  1. calcular el cambio porcentual de V1 = 150 a V2 = 75 (cambio negativo)

[((V2 - V1)/| V1 |) * 100]

= ((75 - 150)/| 150 |) * 100 = (-75/150) * 100 = -0,5 * 100 = -50% de cambio

= 50% de disminución

NOTA: esto no maneja ceros. Puede hacerlo usted mismo