4

23.40次の方法を使用して、23 時間 40 分を意味するdouble で表される時間を変換しようとしています。

private TimeSpan DoubleToTimeSpan(double time)
{
    double hour = Math.Floor(time);
    double minute = (time - hour) * 100d;
    TimeSpan ts = new TimeSpan((int)hour, (int)minute, 0);
    return ts;
}

23.40たとえば、次のように、何度かテストする場合:

Console.WriteLine(DoubleToTimeSpan(23.40));

システムによって23:39:001 分が盗まれました。私の分はどこですか?

: については知ってTimeSpan.FromHoursいますが、このメソッドは分をパーセンテージと見なすため、23.4023 時間と 1 時間の 40%、つまり23:24:00.

4

7 に答える 7

2

int の代わりに丸めてみてください

private TimeSpan DoubleToTimeSpan(double time)
{
    double hour = Math.Floor(time);
    hour.Dump();
    double minute = (time - hour) * 100d;
    minute.Dump();
    TimeSpan ts = new TimeSpan((int)hour, (int)Math.Round(minute), 0);
    return ts;
}

(int)minute だけを実行すると、double の整数部分が使用されます。

于 2013-08-02T12:57:03.337 に答える
0

それがより良い解決策かどうかはわかりませんが、.NET 4.0 以降を使用している場合は、string. ある解釈が、別の"23.40"解釈が である一連の文字のようです。doubleTimeSpan

そのアイデアが気に入ったら、次を使用してください。

TimeSpan DoubleToTimeSpan(double time)
{
    string str = time.ToString("F2", CultureInfo.InvariantCulture);
    TimeSpan ts = TimeSpan.ParseExact(str, "h'.'mm", CultureInfo.InvariantCulture);
    return ts;
}

私はそれをテストしていませんが、おそらく100倍の丸めアプローチほど速くはありません。

于 2013-08-02T13:17:30.470 に答える
0

小数を使用する別のオプション。これにより、精度の低下を防ぐことができます。

decimal minute = ((decimal)time)-((decimal)hour)*100;
于 2013-08-02T13:06:54.827 に答える
0

Math.Floor を 1 時間使用したので、Math.Ceiling を 1 分使用します。それはうまくいくようです。

private static TimeSpan DoubleToTimeSpan(double time)
{
    return new TimeSpan((int)Math.Floor(time), (int)Math.Ceiling((time - Math.Floor(time)) * 100d), 0);
}
于 2013-08-02T13:02:59.617 に答える