长期错误估计

时间:2012-08-03 07:54:57

标签: c#

以下代码中的long数据类型有什么问题,它返回-666167296,时间= 42,TimeStyle.Days?

    private long ConvertToMilliSeconds(int time, TimeStyle style)
    {
        long t = 0;
        switch (style)
        {
            case TimeStyle.Millisecons:
                t = time;
                break;
            case TimeStyle.Seconds:
                t = time * 1000;
                break;
            case TimeStyle.Minutes:
                t = time * 1000 * 60;
                break;
            case TimeStyle.Hours:
                t = time * 1000 * 60 * 60;
                break;
            case TimeStyle.Days:
                t = time * 86400000;
                break;
            default:
                break;
        }

        return t;
    }

3 个答案:

答案 0 :(得分:7)

timeint,将其设为long或投放到long* 86400000L

答案 1 :(得分:3)

当你进行这样的计算时:

t = time * 86400000

tlong这一事实无关紧要:赋值运算符右侧的算法以32位执行,因为time86400000都是int值。您需要在long算术中执行操作以避免溢出。

考虑到long毫秒数是合理的,我只需将t更改为long。如果无法识别枚举值,我也会抛出异常,而不是只返回0:

private static long ConvertToMilliSeconds(long time, TimeStyle style)
{
    switch (style)
    {
        // Note: fixed typo in enum name
        case TimeStyle.Milliseconds: return time;
        case TimeStyle.Seconds:      return time * 1000;
        case TimeStyle.Minutes:      return time * 1000 * 60;
        case TimeStyle.Hours:        return time * 1000 * 60 * 60;
        case TimeStyle.Days:         return time * 86400000;
        default:
            throw new ArgumentOutOfRangeException("style");
    }
}

您可能还想将这些值更改为常量:

private const long MillisecondsPerSecond = 1000;
private const long MillisecondsPerMinute = MillisecondsPerSecond * 60;
private const long MillisecondsPerHour = MillisecondsPerMinute * 60;
private const long MillisecondsPerDay = MillisecondsPerHour * 24;

...并在方法中使用它们。

最后,为了避免在错误的单位中出现任何可能的混淆,您可能只想使用TimeSpan开始...并且如果您仍然找到该日期/时间API很痛苦,你可能想查看我的Noda Time库:)

答案 2 :(得分:0)

42 * 86400000很长。如果我在visual-studio中键入它,我会收到编译器错误:

  

操作在编译时以检查模式溢出