2013-02-12 67 views
13

Tôi có một trường hợp rất lạ trong chức năng Math.round trong VB.NetĐiều gì là sai với Math.Round() trong VB.Net?

Math.Round((32.625), 2) 

Kết quả: 32,62

Math.Round((32.635), 2) 

Kết quả: 32,64

tôi cần 32.63 nhưng hàm hoạt động trong logic khác nhau trong những trường hợp này.

Tôi có thể lấy phần thập phân và làm những gì tôi muốn làm một cái gì đó trên đó. Nhưng không phải là quá kỳ lạ, một là làm tròn để cao hơn, một là làm tròn xuống thấp hơn.

Vậy làm cách nào tôi có thể nhận được 32.63 từ 32.625 mà không gây rối với phần thập phân? (như logic tự nhiên của môn Toán)

+0

my đoán nó đã làm với các đại diện của số dấu chấm động, vì vậy 63,625 có thể thực sự 63,6249999 ... – thumbmunkeys

+0

Nhưng tôi đang viết nó chỉ có "63,625". vì vậy nó không thể là "63.624999" tôi có sai không? – Mtok

+2

Bạn, thật không may, sai - con số trông giống như 32.625 nhưng nội bộ nó được lưu trữ như là một giá trị Float, là không chính xác. Sử dụng một kiểu dữ liệu thập phân cho độ chính xác cao, nhưng hiệu suất chậm. –

Trả lời

32

Math.Round sử dụng của ngân hàng làm tròn theo mặc định. Bạn có thể thay đổi điều đó bằng cách chỉ định tùy chọn MidPointRounding khác. Từ MSDN:

Làm tròn xa zero

giá trị Midpoint được làm tròn đến số tiếp theo xa zero. Ví dụ: ví dụ, 3,75 viên đạn đến 3,8, 3,85 vòng tới 3,9, -3,75 vòng tới -3,8, và -3,85 vòng tới -3,9. Hình thức làm tròn này được đại diện bởi thành viên điều tra MidpointRounding.AwayFromZero. Làm tròn từ zero là hình thức làm tròn được biết đến rộng rãi nhất.

Làm tròn đến gần nhất, hoặc của ngân hàng làm tròn

giá trị Midpoint được làm tròn đến số chẵn gần nhất. Ví dụ: cả 3.75 và 3.85 vòng đến 3.8, và cả hai -3.75 và -3.85 vòng đến -3.8. Hình thức làm tròn này được đại diện bởi thành viên liệt kê MidpointRounding.ToEven.

Làm tròn đến gần nhất là hình thức tiêu chuẩn làm tròn được sử dụng trong hoạt động tài chính và thống kê. Nó phù hợp với chuẩn IEEE 754, phần 4. Khi sử dụng trong nhiều hoạt động làm tròn, nó làm giảm các lỗi làm tròn mà là do luôn làm tròn giá trị trung điểm theo một hướng . Trong một số trường hợp, lỗi làm tròn này có thể là đáng kể.

Vì vậy, những gì bạn muốn là:

Math.Round(32.625, 2, MidpointRounding.AwayFromZero) 
Math.Round(32.635, 2, MidpointRounding.AwayFromZero) 

Như những người khác đã đề cập, nếu chính xác là rất quan trọng, bạn nên sử dụng Decimal biến hơn là loại dấu chấm động. Ví dụ:

Math.Round(32.625D, 2, MidpointRounding.AwayFromZero) 
Math.Round(32.635D, 2, MidpointRounding.AwayFromZero) 
2

Hãy thử điều này.

Dim d As Decimal = 3.625 
    Dim r As Decimal = Math.Ceiling(d * 100D)/100D 
    MsgBox(r) 

Điều này sẽ làm những gì bạn muốn.

+0

xin lỗi, tôi thay đổi nội dung câu trả lời của tôi. Tôi cần phải nhận được 32.63 từ 32.625 mà không rối tung với phần thập phân? – Mtok

+0

Được rồi, điều đó thay đổi mọi thứ. –

+0

Đã chỉnh sửa câu trả lời của tôi cho phù hợp với nhu cầu của bạn dựa trên thông tin đó. Hy vọng nó giúp. Tôi đã sử dụng msgbox để thử nghiệm, bạn có thể lấy nó ra. Lấy làm tiếc. Đó là một cách ngắn để làm điều đó. Trong thực tế, bạn nên làm cho một chức năng ra khỏi nó. –

-1

Bạn không thể sử dụng phao nổi là số như 32.625 được xử lý như trong VB.Net. (Ngoài ra còn có vấn đề làm tròn của ngân hàng như đề cập bởi @StevenDoggart - bạn có thể sẽ phải đối phó với cả hai vấn đề.)

Vấn đề là số được lưu trữ không chính xác những gì được nhập vì những con số này không thành một đại diện nhị phân cố định, ví dụ 32.625 được lưu trữ là 32.62499997 và 32.635 là 32.63500001.
Cách duy nhất để được chính xác là để lưu trữ các số như kiểu Decimal

DIM num as Decimal 
num = ToDecimal("32.625") 
+1

Trong VB.NET, bạn chỉ có thể gõ 'D' hậu tố để xác định một 'Decimal' chữ (ví dụ:' 32.625D') –

+0

How are you nhận được giá trị 32,62499997 từ 32,625? 32.625 phải được biểu diễn chính xác dưới dạng float hoặc double. Giá trị tôi nhận được (sử dụng mã từ trang web của Jon Skeet) cho ** 32.635 ** là 63.63499999999999801048033987171947956085205078125. –

3

Hãy thử điều này (từ bộ nhớ):

Math.Round((32.635), 2, MidPointRounding.AwayFromZero)

1

Hers một chức năng nhanh chóng bạn có thể thêm vào đơn giản hóa cuộc sống của bạn và làm cho nó, do đó bạn không cần phải gõ rất nhiều mọi lúc.

Private Function roundd(dec As Decimal) 
    Dim d As Decimal = dec 
    Dim r As Decimal = Math.Ceiling(d * 100D)/100D 
    Return r 
End Function 

Thêm phần này vào ứng dụng của bạn sau đó sử dụng chức năng

roundd(3.624) 

hoặc bất cứ điều gì bạn cần.

để hiển thị các kết quả - ví dụ

msgbox(roundd(3.625)) 

này sẽ hiển thị một MessageBox với 3,63

Textbox1.text = roundd(3.625) 

này sẽ đặt textbox1.text - 3,63 vv vv Vì vậy, nếu bạn cần để làm tròn sau đó một số, nó sẽ không được tẻ nhạt và bạn có thể tiết kiệm rất nhiều đánh máy.

Hy vọng điều này sẽ hữu ích.

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