2016-04-05 26 views
2

İki kesitten hangisinin diğerinden daha büyük olduğunu bulmalıyım. Bölüm yapısı, pay ve payda için long değerlerini tutar.Uzun değerleri çarpmanın doğru yolu

try 
{ 
    checked 
    { 
    long a = fraction1.Numerator * fraction2.Denominator; 
    long b = fraction2.Numerator * fraction1.Denominator; 
    return a.CompareTo(b); 
    } 
} 
catch 
{ 
    throw new Exception("CompareTo failed"); 
} 

Bu durumlarda geniş bir yelpazede için çalışıyor, ancak bir istisna atılır durumlarda miktarı azaltılabilir a ve b için başka bir veri türünü seçerek şu şekildedir:

naif bir yaklaşımdır .

Hangi veri türü iyi bir seçim olacaktır (tercihen referans olması için fazladan kütüphanesi bulunmuyor)? decimal? BigInteger?

+6

' decimal' gelir veya 'BigInteger' çalışacak, ama sadece beri System.Numerics dan BigInteger başvurulması, bu durumda benim için kabul edilebilir Tabii ki ekstra referans olmaksızın çerçevede. –

+0

"Ondalık" aralığının içinde kalmak için en büyük sayı "kare" 281.474976,710656'dır, ki bu da çok daha küçüktür.MaxValue = 9223372,036854,775807 – David

+0

Whoops - evet, çok yakında çok konuştu . Bunun için üzgünüm. BigInteger veya farklı bir yaklaşıma geçme, ör. ortak faktörler bulmak. –

cevap

0

Ondalık bir çarpma gerçekleştirmeye çalışarak sorunu çözdüm. Ve sadece (performans nedenlerinden dolayı) başarısız olursa, bir BigInteger çarpımı yapacağım. Ortak faktörleri bulmak elbette önceden yapılır.

try 
{ 
    decimal a = (decimal)fraction1.Numerator * (decimal)fraction2.Denominator; 
    decimal b = (decimal)fraction2.Numerator * (decimal)fraction1.Denominator; 
    return a.CompareTo(b); 
} 
catch 
{ 
    BigInteger a = new BigInteger(fraction1.Numerator) * new BigInteger(fraction2.Denominator); 
    BigInteger b = new BigInteger(fraction2.Numerator) * new (fraction1.Denominator); 
    return a.CompareTo(b); 
} 

Yan not: `decimal` o .Net 4. ile

+1

Kontrol edilen blok bu kodda anlamsızdır. Kontrol edilen aritmetik sadece tamsayılar için geçerlidir. –

+0

Değerli ipucu için teşekkürler. Kodumu cevabımda değiştirdim. – David