2011-11-22 41 views
8

Tôi đang sử dụng chức năng ROUND từ C# và SQL, và đáng ngạc nhiên cả hai đều cho kết quả khác nhau.Tại sao các hàm vòng tròn của C# và SQL lại cho kết quả đầu ra khác nhau?

Trong SQL: ROUND(1250.00, -2) = 1300

Trong C# ROUND 1250 với vòng và precision = 2 = 1200

Có ai đi qua tình trạng này trước đây chưa?

+0

mà cơ sở dữ liệu máy chủ bạn đang sử dụng ?? – Baz1nga

+0

Đó là tất cả về cách các ngôn ngữ làm tròn số. SQL của bạn rõ ràng làm tròn UP và C# vòng DOWN khi bạn đang đập ở giữa. Tôi đề nghị cố gắng sử dụng một cái gì đó khác hơn là ROUND. Trần trong SQL làm tròn lên, nhưng không có thêm thông tin về những gì bạn đang cố gắng làm điều đó thực sự là không thể tư vấn về những gì để sử dụng. –

+0

Để làm rõ, C# không làm tròn số; .NET BCL. –

Trả lời

7

C# sử dụng làm tròn của ngân hàng theo mặc định, trong đó khi bạn chính xác trên dấu .5, nó làm tròn đến số chẵn gần nhất thay vì luôn làm tròn lên.

Phần nhận xét của msdn article mô tả hành vi này. Về cơ bản nó làm giảm lỗi làm tròn khi bạn tích lũy rất nhiều số tròn với nhau.

0

Sử dụng tham số trên Math.Round, MidpointRounding, để chỉ định cách làm tròn số của bạn.

public enum MidpointRounding 
{ 
    // When a number is halfway between two others, it is rounded toward 
    // the nearest even number. 
    ToEven = 0, 

    // When a number is halfway between two others, it is rounded toward 
    // the nearest number that is away from zero. 
    AwayFromZero = 1, 
} 

Bạn có thể sử dụng nó theo cách này:

int presicion = 2; 
double valueToRound; 

Math.Round(valueToRound/Math.Pow(10, precision), MidpointRounding.AwayFromZero) 
    * Math.Pow(10, precision); 
+0

Tôi đã thử với tham số này nhưng không sử dụng. Vẫn còn nhận được kết quả tương tự: ( –

1

Phần khó khăn trong làm tròn là phải làm gì với 5 trong số thập phân. Chúng thực sự chính xác nửa đường, vì vậy chúng tạo thành một mối liên kết. Có một chút về tie-breaking trong bài viết Làm tròn của wikipedia. Về cơ bản, C# sử dụng làm tròn của ngân hàng mà làm tròn xuống khi chữ số không có chữ số cuối cùng là thậm chí và lên khi nó lẻ. Điều này phù hợp với tiêu chuẩn IEEE. SQL thay vì tuân thủ quy tắc "luôn luôn tròn 5".

3

nếu bạn đọc http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx, bạn sẽ thấy rằng làm tròn mặc định là "vòng để thậm chí" (của ngân hàng làm tròn), nơi như SQL Server dường như được sử dụng "tiêu chuẩn" làm tròn

Cập nhật SQL Server Hoặc không đối xứng Số học làm tròn hoặc Symmetric Vòng xuống (Fix) tùy thuộc vào đối số

làm thế nào để giải quyết vấn đề: Thực hiện một thủ tục hải quan làm tròn: http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q196652&ID=KB;EN-US;Q196652

+0

Liên kết hỗ trợ không hoạt động nữa. Có một triển khai làm tròn của Ngân hàng trong SQL [ở đây] (http://blogs.lessthandot.com/index.php/datamgmt/datadesign/sql -server-rounding-methods /) –

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