2010-04-30 13 views
7

NET'te çifte hassasiyetle karşılaştığım bir konuyla karşılaştım. Bunun sadece yüzdelere uygulandığını düşündüm ama şimdi bu çiftin bir yüzdürme olduğunu görüyorum.çift eksi çift hassasiyet veren problemler

double test = 278.97 - 90.46; 
Debug.WriteLine(test) //188.51000000000005 

//correct answer is 188.51 

Bu işlemin doğru yolu nedir? Yuvarlak? Gereksiz ondalık basamakları yok et?

+0

Bu çiftleri ne için kullanıyorsunuz? Örneğin parasal değerler için ise, başka tür kullanmanız gerekir. –

+0

Evet, bu para. – Alistair

+0

Bu durumda Michael'ı dinle. Çiftler seni ısırır. –

cevap

8

decimal veri tipini kullanın. "Ondalık değer türü, çok sayıda önemli ayrılmaz ve kesirli rakam gerektiren ve yuvarlama hatası olmayan finansal hesaplamalar için uygundur."

+0

+1 Finansal şeyler yapıyorsanız, * gerçekten * ondalık değeri kullanmanız gerekir. –

+1

Ondalık, finansal hesaplamalar için kullanmanız gereken doğru veri türüdür. Yuvarlama ihtiyacını ortadan kaldırmaz, yuvarlamadan kaynaklanan hataları en aza indirir. –

+0

Teşekkürler. Bu benim sorunumu çözdü. – Alistair

4

Bu, birçok dilde gerçekleşir ve genellikle ikili veya şamandıraları dijital donanımlarda tam olarak depolayamadığımızdan kaynaklanır. Çiftlerin, şamandıraların ve diğer tüm kayan nokta değerlerinin genellikle nasıl saklandığına dair ayrıntılı bir açıklama için, wikipedia'da açıklanan çeşitli IEEE özelliklerine bakın. Örneğin, sabit nokta biçiminde olduğu gibi başka biçimler de vardır. Ancak bu belirsizlik çoğu dilde ve neden sıklıkta koşullu koşullarda (yani abs (x - y) < = x == y yerine 0.0001) eşitlik testleri yerine epsilon testlerini kullanmak zorunda kalıyorsunuz.

Bu kusurla nasıl baş edeceğiniz size bağlıdır ve uygulamanıza bağlıdır.