2009-09-01 62 views
7

Làm thế nào để bạn nhận được giá trị tuyệt đối của một số trong vb.net?Giá trị tuyệt đối trong vb.net

Có chức năng được tích hợp sẵn không? Tôi biết tôi có thể chỉ đơn giản là mã một chức năng bản thân mình, nhưng tôi muốn biết nếu có một đã có trước tiên. Nó có vẻ rất đơn giản, tôi có lẽ có thể làm cho nó trong ba dòng, vì vậy tôi sẽ ngạc nhiên nếu không có một ....

Cảm ơn!

Trả lời

16

Math.Abs ​​(val)

MSDN Link

+0

Thats dễ dàng, cảm ơn! – Cyclone

+1

Vâng, ít nhất là liên kết MSDN có các liên kết con đề cập đến vấn đề tràn tiềm năng, ngay cả khi không ai có thể nghĩ đến việc thực sự nhấp vào chúng. – MusiGenesis

+2

Nhân tiện, tôi nghĩ bạn nên được cấp 20K tiền thưởng danh tiếng ngay lập tức cho công việc của bạn trên The Daily WTF. – MusiGenesis

1

Chức năng là Math.Abs ​​

8

Tại nguy cơ bị xuống bình chọn, bạn có thể muốn viết phương pháp giá trị tuyệt đối của riêng bạn, tùy thuộc về những gì bạn đang sử dụng. Đoạn mã sau đây (xin lỗi nó trong C#, nhưng cùng một nguyên tắc áp dụng):

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

hạnh phúc sẽ biên dịch, nhưng khi chạy, dòng thứ hai sẽ ném một OverflowException với thông điệp hữu ích "Làm giảm giá trị nhỏ nhất của một số bổ sung twos không hợp lệ. " Trong trường hợp này, bởi vì tôi là loại ngắn, trình biên dịch chọn quá tải Math.Abs ​​chấp nhận một đoạn ngắn và trả về một đoạn ngắn, và +32768 không phải là một giá trị hợp lệ, vì vậy phương thức ném ngoại lệ ngay cả khi bạn nghĩ bạn đang dự đoán vấn đề này bằng cách làm cho iAbs một int.

đoạn này:

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

sẽ biên dịch và thực thi mà không một ngoại lệ, nhưng đó là loại clunky mã theo cách này. Theo tôi, đây là một lỗi rất lén lút bởi vì nó rất hiếm khi gặp phải trong thế giới thực (vì chỉ có một giá trị cho mỗi loại sẽ tạo ra ngoại lệ này). Thật không may, tôi gặp phải lỗi này bất cứ khi nào tôi sử dụng Math.Abs ​​để chuẩn hóa dữ liệu âm thanh (thường là mảng ngắn []), vì vậy tôi đã có thói quen viết trình bao bọc riêng của mình xung quanh Math.Abs ​​xử lý tất cả điều này cho tôi và chỉ trả về một đôi:

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

với quá tải cho bất kỳ loại nào khác mà tôi cần xử lý. Tôi hiểu tại sao Math.Abs ​​được viết để hành xử theo cách này, nhưng nó chắc chắn có thể cắn phía sau của những người không biết.

+0

Lol, được rồi, cảm ơn! Tôi chỉ có thể làm một kiểm tra nếu số lượng ít hơn số không và nếu nó sau đó nhân nó bằng một tiêu cực, mà sẽ luôn luôn làm việc, trừ khi số lượng quá lớn cho Windows để phân tích cú pháp. – Cyclone

+1

+1. Tuyệt đối không có nguy cơ bị downvoted! – RobS

+0

Điều này tốt hơn: 'Trả lại (i/i) * i' – beppe9000

Các vấn đề liên quan