私は10進数で時間外労働を計算する、C#で小さなソフトウェアを作成しました。私はそれが常に1時間の最も近い10分の1になるように設計しました。私が抱えている問題は、ちょうど2時間12分または3時間12分の時間を計算しようとすると、私は間違った結果を得ることです。関連するコードは次のとおりです。TimeSpan計算エラー
DateTime start = new DateTime(
dtpDateStart.Value.Year,
dtpDateStart.Value.Month,
dtpDateStart.Value.Day,
dtpTimeStart.Value.Hour,
dtpTimeStart.Value.Minute,
0);
DateTime end = new DateTime(
dtpDateEnd.Value.Year,
dtpDateEnd.Value.Month,
dtpDateEnd.Value.Day,
dtpTimeEnd.Value.Hour,
dtpTimeEnd.Value.Minute,
0);
TimeSpan subtotal = end - start;
double subtotalRounded = subtotal.TotalHours;
subtotalRounded = (Math.Floor(subtotalRounded * 10)/10);
dtpDateStart
、dtpTimeStart
、dtpDateEnd
とdtpTimeEnd
が勝つフォームプロジェクト内のすべての日付時刻ピッカーコントロールです。
このコードをデバッグすると、返される値はsubtotalRounded
で、2.2および3.2の代わりに2.1999999999999997または3.1999999999999997になります。これは、4時間12分以上または1時間12分以下の値では発生しないようです。
とにかく、これらの2つの値だけで丸め誤差が発生するのはなぜですか?誰か提案やコメントがありますか?メソッドを間違って使用していますか、これを行うにはより良い方法がありますか?
これは浮動小数点の「エラー」(意図的な引用符)のようです。丸めの問題(特に小数点以下の桁数)を望まない場合:double - soを使用しないでください:分単位(または秒単位、または任意の精度)で整数として動作します。小数は次のようになります:分(秒、何でも)を小数に変換 –