Ondalık sayıyı int değerine nasıl dönüştürebilirim?
Ondalık sayıyı int değerine nasıl dönüştürebilirim?
Yanıtlar:
Kullan Convert.ToInt32
dan mscorlib
olduğu gibi
decimal value = 3.14m;
int n = Convert.ToInt32(value);
Bkz. MSDN . Ayrıca kullanabilirsiniz Decimal.ToInt32
. Tekrar bakın, MSDN . Son olarak, olduğu gibi doğrudan bir döküm yapabilirsiniz
decimal value = 3.14m;
int n = (int) value;
açık döküm operatörünü kullanır. Bkz. MSDN .
null
vs.'ye 0
karşı ""
) için bazı şaşırtıcı davranışlara sahiptir . Kesinlikle esnekliğini (yani dinamik olarak yazılmış senaryolarda) ihtiyacınız olmadığı sürece
OverflowException
. @Will'in burada daha iyi bir cevap verdiğine inanıyorum stackoverflow.com/a/501165/39532
Convert.ToInt32
ve Decimal.ToInt32
farklı davranır. MSDN'den: Decimal.ToInt32
- Dönüş değeri, ondalık değerin ayrılmaz bir parçasıdır; kesirli basamaklar kesilir . Convert.ToInt32
- Dönüş değeri en yakın 32 bit işaretli tam sayıya yuvarlanır . Değer iki tam sayının ortasındaysa, çift sayı döndürülür; yani, 4.5, 4'e ve 5.5, 6'ya dönüştürülür.
Yapamazsın.
Eh, tabii ki olabilir , ancak bir int (System.ınt32) mümkün olan her ondalık değerini tutmak için yeterince büyük değil.
Bu, int.MaxValue değerinden daha büyük bir ondalık basarsanız taşarsınız ve ondalık int.MinValue değerinden daha küçükse, taşar.
Düşük / taştığınızda ne olur? İki şeyden biri. Derlemeniz işaretlenmezse (yani, CLR yaparsanız ilgilenmez), uygulamanız değer aşımı / azlığı sonrasında devam eder, ancak int'deki değer beklediğiniz gibi olmaz. Bu, kesintili hatalara neden olabilir ve düzeltilmesi zor olabilir. Uygulamanızı, üzerinde çalıştığı önemli verilerin bozulmasına neden olabilecek bilinmeyen bir durumda sonlandırırsınız. İyi değil.
Montajınız kontrol edilirse (properties-> build-> advanced-> aritmetik taşma / taşma veya / işaretli derleyici seçeneğini kontrol edin), bir yetersiz / taşma meydana geldiğinde kodunuz bir istisna atar. Bu muhtemelen daha iyidir; ancak montajlar için varsayılan değer aşırı / düşük akışı kontrol etmemektir.
Asıl soru "ne yapmaya çalışıyorsunuz?" Gereksinimlerinizi bilmeden, kimse bu durumda ne yapmanız gerektiğini söyleyemez , açık olandan başka: YAPMAYIN.
Özellikle ilgilenmiyorsanız, buradaki yanıtlar geçerlidir. Ancak, gereken iletişim bir taşma meydana gelebilir o anlayış ve bir de senin dökme kodu sararak önemli değil kontrolsüz bloğun
unchecked
{
// do your conversions that may underflow/overflow here
}
Bu şekilde, arkanızdan gelen insanlar umursamadığınızı anlarlar ve gelecekte birisi yapılarınızı / kontrolünü değiştirirse, kodunuz beklenmedik şekilde kırılmaz.
Eğer yapmak istediğiniz tüm parçasını bırakarak sayının kesirli kısmını damla, sen Math.Truncate kullanabilirsiniz.
decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
int i = (int)d;
size yuvarlanmış numarayı verecektir.
En yakın çift sayıya yuvarlamak isterseniz (yani> .5 yuvarlanır) kullanabilirsiniz.
int i = (int)Math.Round(d, MidpointRounding.ToEven);
Genel olarak C # 'daki tüm sayısal tipler arasında döküm yapabilirsiniz. Oyuncular sırasında kaybolacak hiçbir bilgi yoksa bunu dolaylı olarak yapabilirsiniz:
int i = 10;
decimal d = i;
yine de isterseniz bunu açıkça yapabilirsiniz:
int i = 10;
decimal d = (decimal)i;
Ancak, oyuncu kadrosu aracılığıyla bilgi kaybedecekseniz, bunu açıkça yapmalısınız (bilgi kaybedebileceğinizi bildiğinizi göstermek için):
decimal d = 10.5M;
int i = (int)d;
Burada ".5" kaybediyorsun. Bu iyi olabilir, ancak bu konuda açık olmanız ve bilgileri kaybettiğinizi size göstermek için açık bir döküm yapmanız gerekir.
ToEven
istatistik kaymasını önlemelisiniz. Ancak ücretli öğeler veya para ile işletiyorsanız AwayFromZero
, doğru seçim gibi görünüyor.
decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);
İşte diğerleri için çok kullanışlı bir dönüştürme veri türü web sayfası. http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html
System.Decimal
üyesi IConvertable
olan arayüzü uygular ToInt32()
.
Çağrı System.Decimal.ToInt32()
sizin için işe yarıyor mu ?
Hızlı yuvarlama için düzgün bir hile, ondalık sayınızı bir int'e vermeden önce .5 eklemektir.
decimal d = 10.1m;
d += .5m;
int i = (int)d;
Hala gidiyor i=10
, ama
decimal d = 10.5m;
d += .5m;
int i = (int)d;
Böylece yuvarlanır i=11
.
Ben kullanmayı tercih Math.Round , Math.Floor , Math.Ceiling veya Math.Truncate uygun olarak açık bir şekilde ayarlanabilir yuvarlama moduna.
Hepsinin de Ondalık döndüğüne dikkat edin - Ondalık bir Int32'den daha büyük bir değer aralığına sahip olduğundan, yine de yayınlamanız (ve taşma / taşma olup olmadığını kontrol etmeniz) gerekir.
checked {
int i = (int)Math.Floor(d);
}
Ondalık sayıyı en yakın tam sayıya yuvarlama
decimal a ;
int b = (int)(a + 0.5m);
ne zaman a = 49.9
, o zamanb = 50
ne zaman a = 49.5
, o zamanb = 50
ne zaman a = 49.4
, o zaman b = 49
vb.
Kutulu ondalık (yani nesne türü içinde ondalık bir değer) varsa döküm operatörü çalışmaz. Convert.ToInt32 (nesne olarak ondalık) bu durumda iyi çalışır.
Bu durum, veritabanından IDENTITY / AUTONUMBER değerleri alınırken ortaya çıkar:
SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar()); // works
int ID = (int)foo.ExecuteScalar(); // throws InvalidCastException
SELECT SCOPE_IDENTITY()
döndürür . Bir döner olarak kutulu bir doğrudan döküm edilemeyen . ya da işe yarayacaktı. numeric(38, 0)
decimal
foo.ExecuteScalar()
decimal
object
int
(int)(decimal)foo.ExecuteScalar()
Convert.ToInt32(foo.ExecuteScalar())
Hiçbir yanıt int aralığının dışında bir ondalık sayı dönüştürmek için gelen OverflowException / UnderflowException ile ilgili gibi görünmüyor.
int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));
Bu çözüm, ondalık değer int aralığının dışındaysa mümkün olan maksimum veya minimum int değerini döndürür. Değer int aralığının içindeyse Math.Round, Math.Ceiling veya Math.Floor ile biraz yuvarlama eklemek isteyebilirsiniz.