Çift Değişkeni Ondalığa Çevirin


96

Nasıl bir döküm a yaptığı doubleiçin decimalpara gelişimini yaparken hangi kullanılır. Nereye Mgidiyor?

decimal dtot = (decimal)(doubleTotal);

Yanıtlar:


85

Yalnızca Msayısal bir değişmez değer için kullanırsınız, yayınladığınızda yalnızca:

decimal dtot = (decimal)doubleTotal;

Bir kayan nokta sayısının tam bir değeri tutmaya uygun olmadığını unutmayın; bu nedenle, önce sayıları birlikte eklerseniz ve sonra Decimalsize dönüştürürseniz yuvarlama hataları alabilirsiniz. Sayıları Decimalbirbirine eklemeden önce dönüştürmek isteyebilir veya ilk etapta sayıların kayan nokta sayıları olmadığından emin olabilirsiniz.


takip sorusu olarak, neden açık dönüşüm gerekli? Bunu denedim ve ikiye katlamanın açıkça ondalık sayıya dönüştürülemeyeceği, ancak ondalık sayı daha fazla hassasiyet taşımıyor mu? (yani bir

4
@Cortana: Bir ondalık basamağın hassasiyeti daha yüksektir, ancak aralık daha küçüktür. Bir ondalık sayı için çift değer aralık dışında olabilir. Bakınız: stackoverflow.com/questions/7817866/…
Guffa

41

MDeğişmez son eke ihtiyaç duymadan, böyle bir ondalık sayıya çift çevirebilirsiniz :

double dbl = 1.2345D;
decimal dec = (decimal) dbl;

MYeni bir değişmez ondalık değer bildirirken şunu kullanmalısınız :

decimal dec = 123.45M;

( M123.45 olmadan, çift ​​olarak kabul edilir ve derlenmez.)


28

varsayılan dönüştürme sınıfını kullan: Convert.ToDecimal(Double)


1
Hayır, çünkü bir OverflowException double vol_y = (double) Decimal.MaxValue + 10E + 28D; Console.WriteLine ("Convert.ToDecimal (vol_y) =" + Convert.ToDecimal (vol_y));
ToXinE

2
@ToXinE IMHO Çoğu durumda bir OverflowException sessizce yanlış veri oluşturmaktan daha iyidir
this.myself

16
Convert.ToDecimal(the double you are trying to convert);

2
Convert sınıfının, C #'daki bir dökümden çok daha esnek ve güvenli olduğunu öğrendim.
Tom

3
"Kasa"? yayınlayamadığında olduğu gibi, çalışma zamanında bir derleyici hatası yerine bir istisna atar? O kadar çok ısırıldım ki
Peter Ritchie

8
@PeterRitchie iş parçacığı biraz eski ama şunu söylemek gerekir: Doğrudan Dönüştürme yöntemini çağırmak daha uygun bir yaklaşım olacaktır. Belki sadece bir optimizasyon manyağıyım, ancak çözülmesi gereken bir talimat daha az bir bonus (çünkü açık (Type) cast sözdizimini kullanmak sadece Convert çağıran bir operatör aşırı yüklemesidir).
Mike Johnson

2
@PeterRitchie: Dile tasarım açısından bakıldığında, oldukça bir typecast izin ikiden dönüşüm yöntemlerinden birini kullanmak için bir programcı gerektirecek şekilde daha iyi olurdu doubleiçin decimalbir için göz önüne alındığında, doublebazı durumlarda (1000000,0 / 3.0) gibi değer bir olur 333333.333333333D sonucunu veren "fazla" hassasiyeti kırpmak istersiniz, ancak diğer durumlarda 333333.333333333313931D sonucunu vererek onu korumak isteyebilirsiniz. Kod, basitçe "ondalık sayıya dönüştür" demek yerine, bu dönüşümün nasıl gerçekleştirileceğini belirtmelidir.
supercat

2
@supercat, ilk yorumumla gerçekten ilgisiz görünüyor çünkü kullanmak Convert.ToDecimal(double)aynıdır (decimal)doubleTotal, ancak doubleTotalfarklı bir türe değiştirilirse, muhtemelen bir derleme zamanı hatasından kaçınır ve bulunması daha zor bir çalışma zamanı hatası verirsiniz çünkü farklı bir ToDecimal geçersiz kılma çağrılabilir. Cast operatörü çok daha açık ...
Peter Ritchie

1

Bu eski bir soru ve ben gerçekten burada gösterilen cevaplardan bazılarını kullandım. Yine de, benim özel senaryomda double, dönüştürmek istediğim değerin decimalgenellikle daha büyük olması mümkündü decimal.MaxValue. Bu nedenle, istisnaları ele almak yerine bu uzantı yöntemini yazdım:

    public static decimal ToDecimal(this double @double) => 
        @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;

Yukarıdaki yaklaşım, taşma istisnalarını ele almakla uğraşmak istemiyorsanız ve böyle bir şey olursa, sadece mümkün olan maksimum değeri (benim durumum) korumak istiyorsanız işe yarar, ancak diğer birçok senaryo için bunun beklenen davranış olmayacağının farkındayım. ve istisna işleme gerekli olabilir.


1
Bu, aşağıdaki durumda başarısız olur double _double = (double) decimal.MaxValue; Karşılaştırmada public static decimal ToDecimal (bu çift _double) => _double> = (double) decimal.MaxValue? decimal.MaxValue: (ondalık) _double;
Martin Eyles
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.