2009-09-01 13 views
7

Jak uzyskać bezwzględną wartość liczby w vb.net?Wartość bezwzględna w vb.net

Czy jest wbudowana funkcja? Wiem, że mogę po prostu samemu zakodować funkcję, ale chcę wiedzieć, czy jest tam pierwszy. Wydaje się to takie proste, prawdopodobnie mógłbym zrobić to w trzech liniach, więc byłbym zaskoczony, gdyby nie było ...

Dzięki!

Odpowiedz

16

Math.Abs ​​(Val)

MSDN Link

+0

To łatwe, dzięki! – Cyclone

+1

Cóż, przynajmniej link MSDN zawiera podlinkami, które wspominają o potencjalnym problemie z przepełnieniem, nawet jeśli nikt nie pomyślałby, aby je kliknąć. – MusiGenesis

+2

Przy okazji, myślę, że powinieneś otrzymać natychmiastową premię za reputację 20K za swoją pracę w Daily WTF. – MusiGenesis

1

Funkcja Math.Abs ​​

8

Na ryzyko bycia dół głosowaniu, może chcesz napisać swoją własną metodę wartości bezwzględnej, w zależności o tym, do czego go używasz. Poniższy fragment kodu (przepraszam to w C#, ale ma zastosowanie ta sama zasada):

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

chętnie skompilować, ale po uruchomieniu, druga linia wygeneruje OverflowException z pomocny komunikat „negując minimalną wartość Liczba podwójnych uzupełnień jest nieprawidłowa. " W tym przypadku, ponieważ i jest typu short, kompilator wybiera przeciążenie Math.Abs, które akceptuje skrót i zwraca skrót, a +32768 nie jest poprawnym shortem, więc metoda generuje wyjątek, nawet jeśli myślałeś, że spodziewasz się ten problem, czyniąc iAbs int.

ten fragment:

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

będzie skompilować i wykonać bez wyjątku, ale to trochę niezgrabne kodować ten sposób. Moim zdaniem jest to bardzo podstępny błąd, ponieważ jest tak rzadko spotykany w realnym świecie (ponieważ istnieje tylko jedna wartość dla każdego typu, który wygeneruje ten wyjątek). Niestety, niestety, napotkam ten błąd za każdym razem, gdy używam Math.Abs ​​do normalizowania danych dźwiękowych (co jest zwykle krótką [] tablicą), więc mam nawyk pisania własnego wrappera wokół Math.Abs, który obsługuje wszystkie to dla mnie i po prostu zwraca double:

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

z przeciążeniami dla każdego innego typu muszę obsługiwać. W pewnym sensie rozumiem, dlaczego Math.Abs ​​został napisany, aby zachowywać się w ten sposób, ale może zdecydowanie ugryźć w tył nieświadomych.

+0

Lol, ok, dzięki! Mogę po prostu sprawdzić, czy liczba jest mniejsza od zera, a następnie pomnożyć ją przez wartość ujemną, która zawsze będzie działać, chyba że liczba jest zbyt duża, aby system Windows mógł je przeanalizować. – Cyclone

+1

+1. Absolutnie nie ma ryzyka, że ​​zostaniesz cofnięty! – RobS

+0

To jest lepsze: 'Powrót (i/i) * i' – beppe9000