做雙計算然後需要被轉換爲int。所以我有一個快速的問題,當一個雙向7.5說一個int,它將返回7.將double轉換爲int,是將它舍入還是捨去數字?
這是一個舍入或只是在小數點後的任何東西的產品嗎?
如果它是四捨五入的結果,它是否聰明,例如0.1到0.5,向下舍入,0.6到0.9,它會向上舍入?
乾杯
做雙計算然後需要被轉換爲int。所以我有一個快速的問題,當一個雙向7.5說一個int,它將返回7.將double轉換爲int,是將它舍入還是捨去數字?
這是一個舍入或只是在小數點後的任何東西的產品嗎?
如果它是四捨五入的結果,它是否聰明,例如0.1到0.5,向下舍入,0.6到0.9,它會向上舍入?
乾杯
它不圓的,它只是返回小數點前的組成部分。
參考(感謝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
}
[Ref](http://msdn.microsoft.com/en-us/library/yht2cx7b.aspx) – Rawling
想到了,謝謝。 – cosmicsafari
如果它返回7的7.5雙,那麼它是不是四捨五入,因爲四捨五入的規則將決定一切皆有5以上都在上漲,而不是下跌。
除非基礎值不是7.5而是7.49999999999,在這種情況下,它可能會在屏幕上顯示7.5,但會舍入到7.由於浮點精度問題,這些類型的問題會發生很多。 OP特別想知道這是否是他問題的真正原因。現在,它不是,但它是一個完全合理的關注。通過將7.7d轉換爲int來測試代碼幾乎不含糊。 – Servy
@Servy(and Brian)此外,將會有'double'數字,比如'7.9999999999999991',其默認字符串表示是'8',但是會用cast語法截斷爲整數'7'。 –
它採用整數部分
double d = 0.9;
System.Console.WriteLine((int)d);
的結果是0
簡單鑄造只是去掉一切都會過去的小數點。要向上或向下舍入,可以使用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;
爲什麼你要在文字上附加'f'?這將它們變成'System.Single',然後又將其隱式轉換爲'System.Double'。使用'd'作爲'double'(或者什麼也不用,因爲小數點的存在意味着默認'double')。 –
不要因爲假設它下降而被愚弄。它將十進制去掉並純粹返回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
在
unchecked
上下文中,轉換總是成功,並且 如下進行。•如果操作數的值是NaN或無限,則 轉換的結果是目標類型的未指定值 。
•否則,源操作數會朝着 四捨五入到最接近的整數值。如果此整數值在 目標類型的範圍內,則此值是 轉換的結果。
•否則,轉換的結果是目標類型的未指定值 。
另請參閱MSDN上的Explicit Numeric Conversions Table — Remarks。
正常投這樣
int number;
double decimals = 7.8987;
number = (int)decimals;
將返回數= 7。這是因爲它只是跳過了至少顯著的數字。如果你想讓它正確地圍在你可以使用Math.Round()這樣的:
number = (int)Math.Round(number);
這將返回數= 8
快速實驗的位會回答這個問題... – Chris
寫兩行代碼可以自己測試,比發表這個問題更快... –
自己檢查一下:int int =(int)7.8; Console.WriteLine(num);' – codingbiz