- ベストアンサー
計算機誤差
ある時刻データの単位が日で表されている場合に、この値を計算機誤差がなく時分秒に変換するにはどうしたらよいでしょうか? 例えば、9時47分30秒は日で表すと a = 0.4079861111111111111111 ですが、この値を以下のように時分秒に変換した場合 9時47分29秒となってしまいます。 hour = (int)(24*a) min = (int)(((24*a)-hour)*60) このような誤差がないように計算するにはどうしたらよいでしょうか?教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、a に、60*60*24 = 86400 (つまり、1日の秒数)をかけてください。 この場合は、 0.4079861111111111111111 * 86400 = 35249.999999999 です。 これが「秒数(つまり整数)」になるはずなので、この時点で四捨五入なりしてください。 あとは、この、整数表現された 「秒数」をもとに、時・分・秒 を出して見てください。 int にキャストしている関係で、小数点以下が消えてしまっているための誤差ですので、どこかで、四捨五入(のような手続き)が必要です。
その他の回答 (2)
- ymmasayan
- ベストアンサー率30% (2593/8599)
回答No.3
計算機の場合おっしゃるような10進小数の切捨て誤差ではなく 2進数に変換するための切捨て誤差です。 対策としては日に微小な小数を加えて時分秒変換し、余りを切り捨てる と言う方法が一般的です。
noname#43437
回答No.2
intにキャストすると、小数点以下切り捨てになるので、このような微妙な誤差が出てきます。とりあえず、四捨五入にするとよいかと。 hour = (int)(24*a+0.5) こんな感じで。。