Skip to content

Commit 51f9947

Browse files
AndreasLeebAndreas Leeb
andauthored
Fix Duration.ToTimeSpan() inaccuracy rounding to millisecond (#1070)
Co-authored-by: Andreas Leeb <[email protected]>
1 parent b530090 commit 51f9947

File tree

3 files changed

+13
-2
lines changed

3 files changed

+13
-2
lines changed

UnitsNet.Tests/CustomCode/DurationTests.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,17 @@ public static void ToTimeSpanShouldNotThrowExceptionOnValuesSlightlySmallerThanT
6363
AssertEx.EqualTolerance(duration.Seconds, timeSpan.TotalSeconds, 1e-3);
6464
}
6565

66+
[Theory]
67+
[InlineData(100, Units.DurationUnit.Nanosecond)]
68+
[InlineData(1, Units.DurationUnit.Microsecond)]
69+
[InlineData(1.234, Units.DurationUnit.Millisecond)]
70+
public static void ToTimeSpanShouldNotRoundToMillisecond(double value, Units.DurationUnit unit)
71+
{
72+
Duration duration = Duration.From(value, unit);
73+
TimeSpan timeSpan = duration.ToTimeSpan();
74+
AssertEx.EqualTolerance(duration.Milliseconds, timeSpan.TotalMilliseconds, 1e-10);
75+
}
76+
6677
[Fact]
6778
public static void ExplicitCastToTimeSpanShouldReturnSameValue()
6879
{

UnitsNet.Tests/UnitsNet.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
4-
<TargetFrameworks>net5.0</TargetFrameworks>
4+
<TargetFrameworks>net5.0;net48</TargetFrameworks>
55
<RootNamespace>UnitsNet.Tests</RootNamespace>
66
<LangVersion>latest</LangVersion>
77
<IsTestProject>true</IsTestProject>

UnitsNet/CustomCode/Quantities/Duration.extra.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public TimeSpan ToTimeSpan()
1818
if ( Seconds > TimeSpan.MaxValue.TotalSeconds ||
1919
Seconds < TimeSpan.MinValue.TotalSeconds )
2020
throw new ArgumentOutOfRangeException( nameof( Duration ), "The duration is too large or small to fit in a TimeSpan" );
21-
return TimeSpan.FromSeconds( Seconds );
21+
return TimeSpan.FromTicks((long)(Seconds * TimeSpan.TicksPerSecond));
2222
}
2323

2424
/// <summary>Get <see cref="DateTime"/> from <see cref="DateTime"/> plus <see cref="Duration"/>.</summary>

0 commit comments

Comments
 (0)