Theo tài liệu, phương pháp decimal.Round
sử dụng thuật toán tròn tới thậm chí không phổ biến đối với hầu hết các ứng dụng. Vì vậy, tôi luôn kết thúc bằng cách viết một hàm tùy chỉnh để thực hiện thuật toán nửa vòng tự nhiên hơn:Tại sao .NET sử dụng làm tròn của ngân hàng làm mặc định?
public static decimal RoundHalfUp(this decimal d, int decimals)
{
if (decimals < 0)
{
throw new ArgumentException("The decimals must be non-negative",
"decimals");
}
decimal multiplier = (decimal)Math.Pow(10, decimals);
decimal number = d * multiplier;
if (decimal.Truncate(number) < number)
{
number += 0.5m;
}
return decimal.Round(number)/multiplier;
}
Có ai biết lý do đằng sau quyết định thiết kế khung này không?
Có bất kỳ triển khai tích hợp nào của thuật toán nửa vòng vào khung không? Hoặc có thể một số API Windows không được quản lý?
Nó có thể gây hiểu lầm cho người mới bắt đầu chỉ đơn giản là viết decimal.Round(2.5m, 0)
mong 3 là kết quả nhưng nhận được 2 thay thế.
Làm tròn không phải là "tự nhiên hơn". Thiên nhiên không liên quan gì đến nó cả. Nó chỉ đơn giản là những gì bạn đã học được ở lớp mẫu giáo khi bạn học được khái niệm "làm tròn". Các bài học ở cấp lớp không phải lúc nào cũng vẽ một bức tranh đầy đủ. –
@Rob Và đó là lý do tại sao nó tự nhiên hơn **, mặc dù nó không đúng * – Pacerier
Tôi không hiểu, @Pacerier. Tôi giải thích lý do tại sao nó không * tự nhiên, và bạn nói đó là thực tế tại sao nó * là * tự nhiên. Lập luận của tôi làm việc như thế nào * chống lại * kết luận của tôi, điều đó ngược lại với kết luận của bạn? Những điều bạn đã quen với việc có thể * cảm thấy * tự nhiên, và đôi khi chúng ta có thể nói rằng một cái gì đó là "bản chất thứ hai", nhưng điều đó không làm cho chúng trở nên tự nhiên. –