-ClassMS.Internal.DoubleUtil
には関数が含まれています
public static int DoubleToInt(double val)
{
return (0 < val) ? (int)(val + 0.5) : (int)(val - 0.5);
}
なぜこれが val を整数に「変換」するのだろうか?
double から int へのキャストは常にフロアを使用するため、.5 を加算すると (負の場合は .5 を減算すると)、1.6 は 2 を返し、1.4 は 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
特別な値 ( NaN
、PositiveInfinity
、NegativeInfinity
)
一部の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
これは単に にキャストするため(int)
です。+ または - は、単に値を丸めるために使用されます。