diff -r cb911e1fb3dc Lib/datetime.py --- a/Lib/datetime.py Wed Feb 25 18:14:47 2015 +0200 +++ b/Lib/datetime.py Wed Feb 25 17:50:05 2015 -0500 @@ -297,6 +297,17 @@ raise TypeError("can't compare '%s' to '%s'" % ( type(x).__name__, type(y).__name__)) +def _divide_and_round(a, b): + """divide a by b and round result to nearest even integer""" + d, r = divmod(a, b) + r2 = r * 2 + if r2 > b: + return d + 1 + if r2 < b: + return d + # resolve ties to even + return d + (d & 1) + class timedelta: """Represent the difference between two datetime objects. @@ -515,8 +526,9 @@ self._seconds * other, self._microseconds * other) if isinstance(other, float): + ms = self._to_microseconds() a, b = other.as_integer_ratio() - return self * a / b + return timedelta(microseconds=_divide_and_round(ms * a, b)) return NotImplemented __rmul__ = __mul__ diff -r cb911e1fb3dc Lib/test/datetimetester.py --- a/Lib/test/datetimetester.py Wed Feb 25 18:14:47 2015 +0200 +++ b/Lib/test/datetimetester.py Wed Feb 25 17:50:05 2015 -0500 @@ -394,6 +394,9 @@ eq((-3*us) * 0.5, -2*us) eq((-5*us) * 0.5, -2*us) + eq(td(seconds=1) * 0.123456, td(microseconds=123456)) + eq(td(seconds=1) * 0.6112295, td(microseconds=611229)) + # Division by int and float eq((3*us) / 2, 2*us) eq((5*us) / 2, 2*us)