SORU
22 Kasım 2008, CUMARTESİ


Neden yapar .NET use banker'varsayılan yuvarlama olarak s?

Belgelere göre, decimal.Round yöntemi birçok uygulama için ortak olan tur için bile bir algoritma kullanır. Ben her zaman daha doğal-yarım-yuvarlak algoritma yapmak için özel bir işlevi yazma sona kadar:

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;
}

Herkes bu çerçeve tasarım kararın arkasındaki neden biliyor mu?

-Dahili uygulama-yarım-yuvarlak çerçeve içine herhangi bir algoritma var mı? Ya da belki bazı yönetilmeyen Windows API?

Sadece decimal.Round(2.5m, 0) sonuç olarak 3 bekliyordum ama onun yerine 2 almak yazmak yeni başlayanlar için yanıltıcı olabilir.

CEVAP
3 Temmuz 2011, Pazar


Banker algoritması (round half to even aka) iyi bir seçimdir nedeni ile diğer cevaplar oldukça doğru. Olumlu ya da olumsuz önyargı kadar en makul dağılımları round half away from zero yöntem olarak sıkıntısı yoktur.

Ama asıl soru neden oldu .NET varsayılan ve cevap Microsoft IEEE 754 standart takip olmasıdır Bankacı gerçek yuvarlama kullanın. Bu da Sözlerinin altında MSDN for Math.Round söz konusu olur.

Ayrıca unutmayın .NET MidpointRounding numaralandırma sağlayarak alternatif yöntem IEEE tarafından belirlenen destekler. Elbette çözme bağları more alternatives vermiş olabilirler, ama sadece IEEE standardı yerine getirmek için seçin.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AllYourNewsByMe

    AllYourNewsB

    18 Temmuz 2011
  • My Name Is Jeff

    My Name Is J

    26 ŞUBAT 2008
  • Triune Films

    Triune Films

    9 ŞUBAT 2006