2009-09-01 13 views
7

Come si ottiene il valore assoluto di un numero in vb.net?Valore assoluto in vb.net

C'è una funzione integrata? So che posso semplicemente programmare una funzione da solo, ma voglio sapere se ce n'è già una prima. Sembra così semplice, potrei probabilmente farlo in tre righe, quindi sarei sorpreso se non ce n'è uno ....

Grazie!

risposta

16

Math.Abs ​​(Val)

MSDN Link

+0

Questo è facile, grazie! – Cyclone

+1

Bene, almeno il link MSDN ha collegamenti secondari che menzionano il potenziale problema di overflow, anche se nessuno penserebbe mai di fare clic su di essi. – MusiGenesis

+2

A proposito, penso che dovresti ottenere un bonus di reputazione immediato di 20K per il tuo lavoro su The Daily WTF. – MusiGenesis

1

La funzione è Math.Abs ​​

8

A rischio di essere down-votato, si consiglia di scrivere il proprio metodo di valore assoluto, a seconda su cosa lo stai usando per. Il seguente frammento di codice (mi dispiace che sia in C#, ma lo stesso principio si applica):

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

sarà lieto di compilare, ma quando viene eseguito, la seconda riga genererà un OverflowException con il messaggio utile "Negare il valore minimo di un il numero del complemento a due non è valido. " In questo caso, poiché i è di tipo short, il compilatore sceglie il sovraccarico di Math.Abs ​​che accetta un breve e restituisce un breve, e +32768 non è un corto valido, quindi il metodo lancia l'eccezione anche se pensavi di anticipare questo problema rendendo iAbs un int.

Questo frammento di codice:

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

si compilare ed eseguire senza eccezione, ma è una specie di goffo per codificare in questo modo. A mio avviso, si tratta di un errore molto subdolo perché è così raro che venga rilevato nel mondo reale (poiché esiste un solo valore per ogni tipo che genererà questa eccezione). Sfortunatamente, mi imbatto in questo errore ogni volta che uso Math.Abs ​​per normalizzare i dati audio (che di solito è un array [] breve, quindi ho preso l'abitudine di scrivere il mio wrapper su Math.Abs ​​che gestisce tutto questo per me e appena restituisce un doppio:

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

con sovraccarichi per qualsiasi altro tipo che ho bisogno di gestire. Capisco perché Math.Abs ​​è stato scritto per comportarsi in questo modo, ma può sicuramente mordere il dietro l'inconsapevole.

+0

Lol, ok, grazie! Posso solo fare un controllo se il numero è inferiore a zero e se è poi moltiplicarlo per uno negativo, che funzionerà sempre a meno che il numero non sia troppo grande per essere analizzato da Windows. – Cyclone

+1

+1. Assolutamente nessun rischio di essere downvoted! – RobS

+0

Questo è meglio: 'Return (i/i) * i' – beppe9000