你能舍入一个.NET TimeSpan
对象吗?
我的Timespan
值为: 00:00:00.6193789
有没有一种简单的方法可以将它保持为TimeSpan
对象,但将其舍入为类似于
00:00:00.62?
发布于 2008-12-03 21:12:33
TimeSpan只不过是'Ticks‘成员的包装器。从另一个TimeSpan的节拍的四舍五入版本创建一个新的TimeSpan是相当容易的。
TimeSpan t1 = new TimeSpan(2345678);
Console.WriteLine(t1);
TimeSpan t2 = new TimeSpan(t1.Ticks - (t1.Ticks % 100000));
Console.WriteLine(t2);
提供:
00:00:00.2345678
00:00:00.2300000
发布于 2016-12-17 07:17:23
考虑到一些关于舍入到秒的注释,我认为舍入到任何TimeSpan都会很好:
public static TimeSpan Round(this TimeSpan ts, TimeSpan rnd) {
if (rnd == TimeSpan.Zero)
return ts;
else {
var rndTicks = rnd.Ticks;
var ansTicks = ts.Ticks + Math.Sign(ts.Ticks) * rndTicks / 2;
return TimeSpan.FromTicks(ansTicks - ansTicks % rndTicks);
}
}
public static TimeSpan Round(this TimeSpan ts) => ts.Round(TimeSpan.FromSeconds(1));
在处理小数单位(per @ToolmakerSteve)时,考虑到舍入到刻度的潜在不准确性,我添加了一个小数舍入选项,用于需要更高精度并舍入为计算机小数秒的情况:
public static TimeSpan RoundToFraction(this TimeSpan ts, long num, long den) => (den == 0.0) ? TimeSpan.Zero : TimeSpan.FromTicks((long)Math.Round(Math.Round((double)ts.Ticks * (double)den / num / TimeSpan.TicksPerSecond) * (double)num / den * TimeSpan.TicksPerSecond));
public static TimeSpan RoundToFraction(this TimeSpan ts, long den) => (den == 0.0) ? TimeSpan.Zero : TimeSpan.FromTicks((long)(Math.Round((double)ts.Ticks * den / TimeSpan.TicksPerSecond) / den * TimeSpan.TicksPerSecond));
发布于 2008-12-03 21:11:12
new TimeSpan(tmspan.Hours, tmspan.Minutes, tmspan.Seconds, (int)Math.Round(Convert.ToDouble(tmspan.Milliseconds / 10)));
https://stackoverflow.com/questions/338658
复制相似问题