Soru MidpointRounding [duplicate] için Decimal.Round varsayılan ayarı


Bu sorunun zaten bir cevabı var:

Aşağıdakiler geçerlidir:

var rounded = Decimal.Round(7.635m, 2);
//rounded: 7.63

Bu benim için yanlış ve beklenmedik bir davranış. Değerini kabul ediyorum yuvarlak olmak 7.64.

Bunu başarmak için şunları yapabilirim:

var rounded = Decimal.Round(7.635m, 2, MidpointRounding.AwayFromZero);
//rounded: 7.64

Bu nasıl olabilir değil varsayılan davranışı olmak Decimal.Round? Bunun için iyi bir sebep var mı?


18
2018-03-14 09:38


Menşei


Şuna baksana stackoverflow.com/a/977807/525138Varsayılanı değiştirebileceğini sanmıyorum. - Dutts
Bunu varsayılan olarak seçtiler, çünkü Decimals'taki çoğu yuvarlama para biriminde yapıldı. Maalesef, gerçekten matematiksel hesaplamaların birçoğunu royally olarak dolduran double.Round () için de varsayılan değerdir - özellikle de piksel koordinatlarını hesaplamakla ilgili olanlar. - Matthew Watson
Herkesin varsayılan olarak yuvarlak olduğunu fark eder örneğinizde tek tek yuvarlanıyor? !! Bu (yanlış?) Davranışını bir makinede buldum ama diğerinde değil. Anodyuma neler olduğunu biliyor mu? - Timo


Cevaplar:


Bu Decimal.Round'un varsayılan davranışı nasıl olmaz? Herhangi bir iyi   Bunun nedeni nedir?

Belgelerine bakarsanız Decimal.Round Yöntemi (Ondalık)

Bu yöntemin davranışı IEEE Standard 754, bölüm 4'ü takip eder.   Bu tür yuvarlama bazen denir hatta yarım yuvarlak veya    bankacı yuvarlaması. Sonuç olarak ortaya çıkan yuvarlama hatalarını en aza indirir.   Bir orta nokta değerinin sürekli olarak tek bir yönde yuvarlanması. Bu   Round (Decimal, MidpointRounding) yöntemini çağırmakla eşdeğerdir   MidpointRounding.ToEven bir mod argümanı.


14
2018-03-14 09:40



Teşekkür ederim, bu mantıklı! :) - Erik Kinding
@ErikKinding, rica ederim - Habib
Bu, varsayılanı onaylar, ancak OP'nin ilk örneğini eklemez. Neden o garip yuvarlanmak? Bu davranışla kendimi düzensiz olarak karşılaşıyorum ve bunu açıklayamıyorum. - Timo
@Timo Bu meydana geldiğinde örnekler verebilir misiniz? - Erik Kinding
@ErikKinding Bir yıl oldu! Artık maalesef örneklerim yok. Benim makinem üretir 7.64 itibaren Decimal.Round(7.635m, 2) beklediğim gibi. Seninki hala üretiyor mu? 7.63, asıl gönderideki gibi? - Timo


itibaren Math.Round(Decimal, Int32) Yöntem

Bu yöntemin davranışı IEEE Standard 754, bölüm 4'ü takip eder.   tür yuvarlama bazen en yakın ya da bankacının yuvarlanması olarak adlandırılır   yuvarlama. Sürekli olarak ortaya çıkan yuvarlama hatalarını en aza indirir   bir orta nokta değerinin tek bir yöne yuvarlanması.

Bu yöntem, bir mod ile Yuvarlak yöntemini çağırmaya eşdeğerdir   MidpointRounding.ToEven argümanı. Tek bir sıfır yoksa   ondalık basamakların ondalık basamağının sağında d cinsinden rakam   5, ondalık basamaktaki rakam tek ise yuvarlanır   ya da eşit ise değişmeden kalır. D'den daha az kesirli basamağa sahipse   ondalık, d değişmeden döndürülür.


3
2018-03-14 09:41





Nedeni, IEEE Standard 754, bölüm 4'ü takip eden bir yöntem uyguladı. Buna en yakın veya bazen bankacıların yuvarlanması için yuvarlama denir.

Yuvarlama yapmak için birçok yoldan sadece biri ve bunu seçiyorlar. Görmek: http://en.wikipedia.org/wiki/Bankers_rounding

Ve daha fazla bilgi için: .NET neden bankanın yuvarlamasını varsayılan olarak kullanıyor?


0
2018-03-14 09:49