あなたはTimeSpan
タイプを設計する開発者であるとします。基本的な機能をすべて備えています。それはすごくうまくいっているようだ。そしてある日、一部のベータテスターに沿って来て、あなたにこのコードを示しています
double x = 100000000000000;
double y = 0.5;
TimeSpan t1 = TimeSpan.FromMilliseconds(x + y);
TimeSpan t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
なぜその出力False
していますか?テスターがあなたに尋ねます。これがなぜ起こったのか理解していても(x
とy
の精度の喪失)、はと思われます。それから彼はあなたに、このいずれかをスローします。
x = 10.0;
y = 0.5;
t1 = TimeSpan.FromMilliseconds(x + y);
t2 = TimeSpan.FromMilliseconds(x) + TimeSpan.FromMilliseconds(y);
Console.WriteLine(t1 == t2);
1つの出力True
こと!テスターは分かりやすく懐疑的です。
この時点で、あなたは決定を下します。どちらかは、double
値から構成されているTimeSpan
値間の演算は、その精度double
タイプ自体 -eg、100000000000000.5(16有効数字)の精度を超える結果を生成するために許可することができ、-OR次のことができ、あなた知って、ではないを許可します。
double
を使用してTimeSpan
を作成する方法では、最も近いミリ秒に丸められるようにします。つまり、はdouble
からTimeSpan
への変換は、double
からTimeSpan
に変換して正確な結果を期待してクライアントがこのような奇妙な振る舞いを見ている場合に私を許してくれます。
私は必ずしもこれがここでの「正しい」決定ではないと主張しているわけではありません。明らかに、このアプローチはそれ自体でいくつかの混乱を引き起こします。私はちょうど決定がある方法か他の方法で作られる必要があったと言っています、そして、これは明らかに決定されたものです。
古い回答が表示されなくて申し訳ありません。 – Peter
「これがなぜこのようなことが起こっているのかが分かり次第、無駄な時間を我慢しやすくなるだろう」と私は思う。それは沈んだコストと考えてください。 – jason
それにも噛まれました。私の理論は、それが.net 1のバグであり、既存のプログラムを壊すので変更されていないということです。 IMO MSは、インテリセンスの記述を更新して、これらの関数がミリ秒の精度しか持たないことを示す必要があります。 – CodesInChaos