簡體   English   中英

如何在 C# 中將小數轉換為 int?

[英]How do I convert a decimal to an int in C#?

如何將十進制轉換為整數?

使用mscorlib中的Convert.ToInt32作為

decimal value = 3.14m;
int n = Convert.ToInt32(value);

請參閱MSDN 您還可以使用Decimal.ToInt32 再次,請參閱MSDN 最后,您可以像這樣進行直接轉換

decimal value = 3.14m;
int n = (int) value;

它使用顯式轉換運算符。 請參閱MSDN

你不能。

嗯,當然可以,但是 int (System.Int32) 不足以容納所有可能的十進制值。

這意味着如果你轉換一個大於 int.MaxValue 的小數,你會溢出,如果小數小於 int.MinValue,它會下溢。

當你下/溢出時會發生什么? 兩件事之一。 如果您的構建未被檢查(即,CLR 不關心您是否這樣做),您的應用程序將在值上溢/下溢后繼續運行,但 int 中的值將不是您所期望的。 這可能會導致間歇性錯誤並且可能難以修復。 您的應用程序最終將處於未知狀態,這可能會導致您的應用程序損壞其正在處理的任何重要數據。 不好。

如果您的程序集被檢查(屬性->構建->高級->檢查算術溢出/下溢或 /checked 編譯器選項),您的代碼將在發生下/溢出時拋出異常。 這可能總比沒有好; 然而,程序集的默認設置是不檢查上溢/下溢。

真正的問題是“你想做什么?” 在不知道您的要求的情況下,沒有人可以告訴您在這種情況下該做什么,除了顯而易見的:不要這樣做。

如果你特別不關心,這里的答案是有效的。 但是,您應該傳達您的理解,即可能會發生溢出,並且將您的強制轉換代碼包裝在未經檢查的塊中並不重要

unchecked
{
  // do your conversions that may underflow/overflow here
}

這樣后面的人就會明白你不在乎,如果將來有人將你的構建更改為 /checked,你的代碼不會意外中斷。

如果您只想去掉數字的小數部分,留下整數部分,您可以使用 Math.Truncate。

decimal actual = 10.5M;
decimal expected = 10M;
Assert.AreEqual(expected, Math.Truncate(actual));
int i = (int)d;

會給你四舍五入的數字。

如果您想四舍五入到最接近的偶數(即 >.5 將四舍五入),您可以使用

int i = (int)Math.Round(d, MidpointRounding.ToEven);

通常,您可以在 C# 中的所有數字類型之間進行轉換。 如果在轉換過程中沒有信息會丟失,您可以隱式地進行:

int i = 10;
decimal d = i;

如果你願意,你仍然可以明確地做到這一點:

int i = 10;
decimal d = (decimal)i;

但是,如果您要通過演員表丟失信息,則必須明確地這樣做(以表明您知道您可能會丟失信息):

decimal d = 10.5M;
int i = (int)d;

在這里你失去了“.5”。 這可能沒問題,但您必須明確說明它並進行明確的轉換以表明您知道您可能會丟失信息。

decimal d = 2;
int i = (int) d;

這應該工作得很好。

decimal vIn = 0.0M;
int vOut = Convert.ToInt32(vIn);

這是一個非常方便的轉換數據類型網頁,供其他人使用。 http://www.convertdatatypes.com/Convert-decimal-to-int-in-CSharp.html

System.Decimal實現IConvertable接口,該接口具有ToInt32()成員。

調用System.Decimal.ToInt32()對你System.Decimal.ToInt32()嗎?

將小數四舍五入到最接近的整數

decimal a ;
int b = (int)(a + 0.5m);

a = 49.9 ,則b = 50

a = 49.5 ,則b = 50

a = 49.4 ,然后b = 49等等。

十進制d = 5.5 ;

int i = decimal.ToInt32(d);// you will get i = 5

參考: 鏈接文本

快速舍入的一個巧妙技巧是在將小數轉換為 int 之前加上 0.5。

decimal d = 10.1m;
d += .5m;
int i = (int)d;

仍然留下i=10 ,但是

decimal d = 10.5m;
d += .5m;
int i = (int)d;

將四舍五入以便i=11

我更喜歡使用Math.RoundMath.FloorMath.CeilingMath.Truncate來明確設置適當的舍入模式。

請注意,它們也都返回 Decimal - 因為 Decimal 的值范圍比 Int32 大,所以您仍然需要強制轉換(並檢查溢出/下溢)。

 checked {
   int i = (int)Math.Floor(d);
 }

我發現如果您有一個裝箱小數(即對象類型內的十進制值),則轉換運算符不起作用。 Convert.ToInt32(decimal as object) 在這種情況下工作正常。

從數據庫中檢索 IDENTITY/AUTONUMBER 值時會出現這種情況:

SqlCommand foo = new SqlCommand("INSERT INTO...; SELECT SCOPE_IDENTITY()", conn);
int ID = Convert.ToInt32(foo.ExecuteScalar());  // works
int ID = (int)foo.ExecuteScalar();              // throws InvalidCastException

4.3.2 拆箱轉換

似乎沒有答案處理來自嘗試轉換 int 范圍之外的小數的 OverflowException/UnderflowException。

int intValue = (int)Math.Max(int.MinValue, Math.Min(int.MaxValue, decimalValue));

如果十進制值超出 int 范圍,此解決方案將返回可能的最大或最小 int 值。 當值在 int 范圍內時,您可能希望使用 Math.Round、Math.Ceiling 或 Math.Floor 添加一些舍入。

將十進制轉換為整數

decimal decimalValue=5.00;
int intValue=Convert.ToInt32(decimalValue);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM