2

-ClassMS.Internal.DoubleUtilには関数が含まれています

public static int DoubleToInt(double val)
{
    return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}

なぜこれが val を整数に「変換」するのだろうか?

4

3 に答える 3

4

double から int へのキャストは常にフロアを使用するため、.5 を加算すると (負の場合は .5 を減算すると)、1.6 は 2 を返し、1.4 は 1 を返します。

于 2013-08-07T11:53:14.887 に答える
1

数値 > 0 の場合、0.5 を追加して切り捨てます。数値 < 0 の場合、0.5 を引いて切り捨てます。

キャストは実際には(int)切り捨てられるので(int)7.8 == 7(int)-7.8 == 7(int)7.995 == 7などです。

したがって、次のようになります。

0-0.499999... is rounded to 0 (0.499999 + 0.5 == 0.999999 trucated == 0)
0.5-1... is rounded to 1 (1 + 0.5 == 1.5 truncated == 1) 

等々。

負の数の場合はその逆です。

境界ケース (範囲外の値int.MinValue - int.MaxValue) はおそらく無視されるため、Double特別な値 ( NaNPositiveInfinityNegativeInfinity)

一部のdouble数値には問題がある可能性があります。これdoubleは、「正確」ではないため (説明が複雑です。倍精度が悪い理由を探してみてください)、多くの場合、表示されているものは実際に持っているものとは異なるため、考えられるものがある可能性があります。 1.5 ですが、実際には 1.499999999999985 であるため、2 ではなく 1 に丸められます。

何かのようなもの:

double d = 11.3;

// There are 20x += 0.01 
d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;
d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;
d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;
d += 0.01; d += 0.01; d += 0.01; d += 0.01; d += 0.01;

Console.WriteLine("{0}", d);
Console.WriteLine("{0:R}", d);
Console.WriteLine("{0}", DoubleToInt(d));

結果:

11.5
11.499999999999996
11
于 2013-08-07T11:52:59.540 に答える
0

これは単に にキャストするため(int)です。+ または - は、単に値を丸めるために使用されます。

于 2013-08-07T11:53:58.803 に答える