2012-11-08 226 views
14

做雙計算然後需要被轉換爲int。所以我有一個快速的問題,當一個雙向7.5說一個int,它將返回7.將double轉換爲int,是將它舍入還是捨去數字?

這是一個舍入或只是在小數點後的任何東西的產品嗎?

如果它是四捨五入的結果,它是否聰明,例如0.1到0.5,向下舍入,0.6到0.9,它會向上舍入?

乾杯

+7

快速實驗的位會回答這個問題... – Chris

+0

寫兩行代碼可以自己測試,比發表這個問題更快... –

+0

自己檢查一下:int int =(int)7.8; Console.WriteLine(num);' – codingbiz

回答

28

它不圓的,它只是返回小數點前的組成部分。

參考(感謝Rawling):Explicit Numeric Conversions Table

您可以通過編寫簡單的測試,嘗試這樣的自己簡單的問題。下面的測試(使用NUnit)將通過,因此給出一個回答你的問題:

[Test] 
public void Cast_float_to_int_will_not_round_but_truncate 
{ 
    var x = 3.9f; 
    Assert.That((int)x == 3); // <-- This will pass 
} 
+0

[Ref](http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx) – Rawling

+0

想到了,謝謝。 – cosmicsafari

0

如果它返回7的7.5雙,那麼它是不是四捨五入,因爲四捨五入的規則將決定一切皆有5以上都在上漲,而不是下跌。

+1

除非基礎值不是7.5而是7.49999999999,在這種情況下,它可能會在屏幕上顯示7.5,但會舍入到7.由於浮點精度問題,這些類型的問題會發生很多。 OP特別想知道這是否是他問題的真正原因。現在,它不是,但它是一個完全合理的關注。通過將7.7d轉換爲int來測試代碼幾乎不含糊。 – Servy

+0

@Servy(and Brian)此外,將會有'double'數字,比如'7.9999999999999991',其默認字符串表示是'8',但是會用cast語法截斷爲整數'7'。 –

4

它採用整數部分

double d = 0.9; 
System.Console.WriteLine((int)d); 

的結果是0

8

簡單鑄造只是去掉一切都會過去的小數點。要向上或向下舍入,可以使用Math.Round() method。這將會向上或向下舍入,並提供一個參數,以便在中途如何處理。在投射之前,您也可以使用Math.Floor()Math.Ceiling()方法隱式舍入或舍入。以下是一些示例:

double num1 = 3.5; 
double num2 = 3.2; 
double num3 = 3.9; 

(int)num1 // returns 3; 
(int)num2 // returns 3; 
(int)num3 // returns 3 also; 
(int)Math.Round(num1) // returns 4 
(int)Math.Round(num2) // returns 3 
(int)Math.Round(num3) // returns 4 
(int)Math.Floor(num1) // returns 3 
(int)Math.Floor(num2) // returns 3 
(int)Math.Floor(num3) // returns 3 
(int)Math.Ceiling(num1) // returns 4 
(int)Math.Ceiling(num2) // returns 4; 
(int)Math.Ceiling(num3) // returns 4; 
+0

爲什麼你要在文字上附加'f'?這將它們變成'System.Single',然後又將其隱式轉換爲'System.Double'。使用'd'作爲'double'(或者什麼也不用,因爲小數點的存在意味着默認'double')。 –

8

不要因爲假設它下降而被愚弄。它將十進制去掉並純粹返回double的整數部分。這對於負數很重要,因爲從2.75開始舍入爲2,但是從-2.75開始舍入爲-3。鑄造不會減少,所以(int)2.75給出2,但(int)-2.75給你-2。

double positiveDouble = 2.75; 
double negativeDouble = -2.75; 

int positiveInteger = (int) positiveDouble; 
int negativeInteger = (int) negativeDouble; 

Console.WriteLine(positiveInteger + " = (int)" + positiveDouble); 
Console.WriteLine(negativeInteger + " = (int)" + negativeDouble); 

Console.ReadLine(); 

//Output: 2 = (int)2.75 
//  -2 = (int)-2.75 
0

C# Language Specification

unchecked上下文中,轉換總是成功,並且 如下進行。

•如果操作數的值是NaN或無限,則 轉換的結果是目標類型的未指定值 。

•否則,源操作數會朝着 四捨五入到最接近的整數值。如果此整數值在 目標類型的範圍內,則此值是 轉換的結果。

•否則,轉換的結果是目標類型的未指定值 。

另請參閱MSDN上的Explicit Numeric Conversions Table — Remarks

0

正常投這樣

int number; 
double decimals = 7.8987; 

number = (int)decimals; 

將返回數= 7。這是因爲它只是跳過了至少顯著的數字。如果你想讓它正確地圍在你可以使用Math.Round()這樣的:

number = (int)Math.Round(number); 

這將返回數= 8