fix: round decimal unit values instead of truncating in integer path
Multiplying a decimal quantity by its unit multiplier in binary floating
point can land just below the exact integer (float('2.05') * 60 ==
122.999...), so int() truncated 2.05m to 122 seconds instead of 123.
Round the sub-second unit contribution before adding whole seconds.
This commit is contained in:
1 parent
546a3e846e
commit
7b055c8116
3 files changed
+91
-3
No files matched your search
@@ -358,6 +358,16 @@ class TestTimeparse(unittest.TestCase):
|
||||
self.assertEqual(timeparse.timeparse('+5.6 weeks'), 3386880)
|
||||
self.assertEqual(timeparse.timeparse('-5.6 weeks'), -3386880)
|
||||
|
||||
def test_timeparse_fractional_rounding(self):
|
||||
'''Decimal quantities that equal a whole number of seconds must not be
|
||||
truncated by binary floating-point error (e.g. 2.05 * 60 == 122.999...).'''
|
||||
self.assertEqual(timeparse.timeparse('2.05m'), 123)
|
||||
self.assertEqual(timeparse.timeparse('+2.05m'), 123)
|
||||
self.assertEqual(timeparse.timeparse('-2.05m'), -123)
|
||||
self.assertEqual(timeparse.timeparse('4.1m'), 246)
|
||||
self.assertEqual(timeparse.timeparse('1.13h'), 4068)
|
||||
self.assertEqual(timeparse.timeparse('8.03h'), 28908)
|
||||
|
||||
def test_doctest(self):
|
||||
'''Run timeparse doctests.'''
|
||||
self.assertTrue(doctest.testmod(timeparse, raise_on_error=True))
|
||||
Reference in new issue
Block a user