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

  • CrazyMan

    CrazyMan

    14 Mayıs 2008
  • Karan Thakur

    Karan Thakur

    23 HAZİRAN 2010
  • Professor Messer

    Professor Me

    27 NİSAN 2007