あなたが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
!テスターは当然のことながら懐疑的です。
この時点で、決定を下す必要があります。値から構築された値間の算術演算を許可して、その精度が型自体の精度を超える結果を生成することもできます(たとえば、100000000000000.5(有効数字16桁))。または、許可しないこともできます。TimeSpan
double
double
だからあなたは、あなたが何を知っているかを決定します、私はそれを作るだけで、aを使用してadouble
を構築するすべてのメソッドTimeSpan
が最も近いミリ秒に丸められるようにします。このように、 aからaへの変換は損失の多い操作であり、クライアントがからに変換して正確な結果を期待した後にこのような奇妙な動作が見られる場合は、私を免除することが明示的に文書化されています。double
TimeSpan
double
TimeSpan
私は、これがここでの「正しい」決定であると必ずしも主張しているわけではありません。明らかに、このアプローチはそれ自体でいくらかの混乱を引き起こします。どちらかの方法で決定を下す必要があると言っているだけで、これが明らかに決定されたものです。