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

  • iZAPPA

    iZAPPA

    16 Temmuz 2010
  • Kiddyzuzaa

    Kiddyzuzaa

    25 ŞUBAT 2014
  • Stevie

    Stevie

    2 Mayıs 2010