web-dev-qa-db-ja.com

doubleをintとしてキャストすると、数字が丸められたり、取り除かれたりしますか?

Intにキャストする必要があるdoubleを使用していくつかの計算を行います。だから私は簡単な質問があります、double say 7.5をintにキャストすると、7を返します。

これは、小数点以下の丸めまたは単に縞模様の製品ですか?

それが丸めの積である場合、それは賢いですか、すなわち0.1から0.5は切り捨て、0.6から0.9は切り上げますか?

乾杯

24
cosmicsafari

丸めず、小数点の前の整数部分を返すだけです。

参照(ありがとう ローリング明示的な数値変換テーブル

Doubleまたはfloat値を整数型に変換すると、この値はゼロに向かって最も近い整数値に丸められます。

簡単なテストを書いて、このような簡単な問題を自分で試すことができます。次のテスト( 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
}
40
Dennis Traub

それが切り捨てられると仮定して騙されないでください。小数を取り除き、純粋に倍精度の整数部分を返します。 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
16
TylerOhlsen

キャストするだけで、小数点以下のすべてが取り除かれます。切り上げまたは切り捨てには、 Math.Round()メソッド を使用できます。これは切り上げまたは切り捨てを行い、途中で何をすべきかに関するパラメーターを提供します。 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;
11
Icemanind

整数部分を取ります

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

結果は0です

5
msancho

このような通常のキャスト

int number;
double decimals = 7.8987;

number = (int)decimals;

これは数値= 7を返します。これは、最下位の数値をスキップするだけだからです。適切に丸めたい場合は、次のようにMath.Round()を使用できます。

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

これは、number = 8を返します。

2
7heViking

7.5の倍数で7を返す場合、丸めのルールではなく、5以上の値は切り捨てではなく切り上げとなるため、丸めではありません。

0
Brian Warshaw

C#言語仕様 から:

uncheckedコンテキストでは、変換は常に成功し、次のように進行します。

•オペランドの値がNaNまたは無限の場合、変換の結果は、宛先タイプの未指定の値になります。

•それ以外の場合、ソースオペランドはゼロに向かって最も近い整数値に丸められます。この整数値が宛先タイプの範囲内にある場合、この値は変換の結果です。

•それ以外の場合、変換の結果は、宛先タイプの未指定の値になります。

MSDNの Explicit Numeric Conversions Table — Remarks も参照してください。

0