1

DateTime をユリウス日付に変換し、Windows 7 で逆にしようとしています。

    public static double ToJulianDate(this DateTime dt) {
        return dt.ToOADate() + 2415018.5;
    }
    public static DateTime Julian2DT(this double julian) {
        return DateTime.FromOADate(julian - 2415018.5);
    }

以下のようにこれら2つの機能をテストすると

var dt = DateTime.Now;
dt.ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();
dt.ToJulianDate().Julian2DT().ToString("yyyy-MM-dd HH:mm:ss.ffffff").Dump();

逆のユリウス日付は、常に元の DateTime 値と数百マイクロ秒だけわずかに異なる値を持ちます。

間違ったコードを書いたのでしょうか、それとも Windows のタイム システムに数マイクロ秒の誤差がありますか?

4

1 に答える 1

1

ユリウス日がとして表されるのは当然の結果であり、double常に精度が制限されます。たとえば、現在の値は約2456348.78370906です。これにより、小数点の前に有効数字7桁が与えられ、adoubleは小数点以下15桁までしか正確ではありません。したがって、小数部には約8桁の精度があります...これは1日を表すことを意味します。

現在、1日/ 100000000=0.000864秒です。ですから、精度は1ミリ秒弱しか期待できません。

ユリウス日用の定数を追加しないと、状況はかなりバラ色に見えます。その時点では、現在の値は約41330しかないため、時刻の精度の値には、より多くの「余地」があります。基本的に、浮動小数点値が大きくなるほど、絶対的には精度が低下します。(隣接する値の差が大きくなります。)

于 2013-02-25T06:51:27.307 に答える