在我正在编写的 C#.Net 应用程序中,我希望将一些 DateTime 值四舍五入到最接近的第 200 毫秒。我想出了以下代码; public static DateTime RoundToTheTwoHundredthMillisecond(DateTime dt) { var ms = dt.Millisecond; var s = dt.Second; var m = dt.Minute; var h = dt.Hour; var d = dt.Day; var M = dt.Month; var y = dt.Year; if (ms >= 900 && ms < 1000) ms = 1000; if (ms >= 700 && ms < 900) ms = 800; if (ms >= 500 && ms < 700) ms = 600; if (ms >= 300 && ms < 500) ms = 400; if (ms >= 100 && ms < 300) ms = 200; if (ms >= 0 && ms < 100) ms = 0; // 1000 is an invalid millisecond. We need to round up a second. Use AddSeconds so it will automatically roll up should we be 1 second away from a new minute, 1 minute away from a new hour...etc...leap years and months are handled also.... if (ms == 1000) { return new DateTime(y, M, d, m, h, s, 0, dt.Kind).AddSeconds(1); } else { return new DateTime(y, M, d, m, h, s, ms, dt.Kind); } }我认为它可能有效。但是我想知道是否有人可以向我指出一种可能比我的摸索更可靠的方法?或者,也许,这是一个人会/应该为其编写单元测试的东西吗?(这样做似乎也容易引起我自己的摸索)
2 回答
largeQ
TA贡献2039条经验 获得超7个赞
您可以只除以 200,四舍五入并乘以返回值。你也可以只减去原始的差异DateTime,不需要重建它的组件我的组件。
public static DateTime RoundToTheTwoHundredthMillisecond(DateTime dt)
{
var ms = Math.Round(dt.Millisecond / 200.0) * 200;
return dt.AddMilliseconds(ms- dt.Millisecond);
}
编辑
为了模仿if我们可以使用的确切序列MidpointRounding
public static DateTime RoundToTheTwoHundredthMillisecond(DateTime dt)
{
var ms = Math.Round(dt.Millisecond / 200.0, MidpointRounding.ToEven) * 200;
return dt.AddMilliseconds(ms- dt.Millisecond);
}
- 2 回答
- 0 关注
- 137 浏览
添加回答
举报
0/150
提交
取消