2009-09-01 330 views
7

¿Cómo se obtiene el valor absoluto de un número en vb.net?Valor absoluto en vb.net

¿Hay una función incorporada? Sé que puedo simplemente codificar una función yo mismo, pero quiero saber si hay una ya allí primero. Parece tan simple, probablemente podría hacerlo en tres líneas, así que me sorprendería si no hay uno ....

¡Gracias!

Respuesta

16

Math.Abs ​​(Val)

MSDN Link

+0

¡Es fácil, gracias! – Cyclone

+1

Bueno, al menos el enlace de MSDN tiene sub-enlaces que mencionan el posible problema de desbordamiento, incluso si nadie pensara hacer clic en ellos. – MusiGenesis

+2

Por cierto, creo que se le debería otorgar un bono de reputación de 20K inmediato por su trabajo en The Daily WTF. – MusiGenesis

1

La función es Math.Abs ​​

8

A riesgo de ser votado hacia abajo, es posible que desee escribir su propio método de valor absoluto, dependiendo en lo que lo estás usando. El siguiente fragmento de código (lo siento es en C#, pero se aplica el mismo principio):

short i = -32768; 
int iAbs = Math.Abs(i); 

estará feliz de compilar, pero cuando se ejecuta, la segunda línea arrojará una OverflowException con el mensaje útil "negando el valor mínimo de una el número del complemento de dos no es válido. " En este caso, como i es tipo abreviado, el compilador elige la sobrecarga de Math.Abs ​​que acepta un corto y devuelve un breve, y +32768 no es un corto válido, por lo que el método arroja la excepción incluso si pensabas que estabas anticipando este problema al hacer que iAbs sea int.

Este fragmento:

short i = -32768; 
int iAbs = Math.Abs((int)i); 

se compilar y ejecutar sin una excepción, pero es una especie de torpe para codificar de esta manera. En mi opinión, este es un error muy furtivo porque rara vez se encuentra en el mundo real (ya que solo hay un valor para cada tipo que generará esta excepción). Desafortunadamente, encuentro este error cada vez que uso Math.Abs ​​para normalizar los datos de audio (que generalmente es una matriz corta []), así que tengo el hábito de escribir mi propio envoltorio alrededor de Math.Abs ​​que maneja todos esto para mí y sólo devuelve un doble:

public double AbsThatDoesntSuck(short value) 
{ 
    return Math.Abs((double)value); 
} 

con sobrecargas por cualquier otro tipo que necesito para manejar. Entiendo por qué Math.Abs ​​se escribió para comportarse de esta manera, pero definitivamente puede morder las espaldas de los desconocedores.

+0

¡Jajaja, está bien, gracias! Puedo hacer una verificación si el número es menor que cero y, si es así, multiplicarlo por uno negativo, que siempre funcionará a menos que el número sea demasiado grande para que Windows lo analice. – Cyclone

+1

+1. Absolutamente no hay riesgo de ser votado negativamente! – RobS

+0

Esto es mejor: 'Retorno (i/i) * i' – beppe9000

Cuestiones relacionadas