From: John Madhavan-Reese Date: Mon, 25 Aug 2014 16:19:19 +0000 (-0400) Subject: Floating point math errors in duration .as method output. X-Git-Tag: 2.8.3~8^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d6db373ecb5629d1c12df12968188ab2ebcbfa52;p=thirdparty%2Fmoment.git Floating point math errors in duration .as method output. --- diff --git a/moment.js b/moment.js index 432c0aec1..5f7054135 100644 --- a/moment.js +++ b/moment.js @@ -2690,19 +2690,21 @@ var days, months; units = normalizeUnits(units); - days = this._days + this._milliseconds / 864e5; if (units === 'month' || units === 'year') { + days = this._days + this._milliseconds / 864e5; months = this._months + daysToYears(days) * 12; return units === 'month' ? months : months / 12; - } else { - days += yearsToDays(this._months / 12); + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + yearsToDays(this._months / 12); switch (units) { - case 'week': return days / 7; - case 'day': return days; - case 'hour': return days * 24; - case 'minute': return days * 24 * 60; - case 'second': return days * 24 * 60 * 60; - case 'millisecond': return days * 24 * 60 * 60 * 1000; + case 'week': return days / 7 + this._milliseconds / 6048e5; + case 'day': return days + this._milliseconds / 864e5; + case 'hour': return days * 24 + this._milliseconds / 36e5; + case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; + case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; default: throw new Error('Unknown unit ' + units); } }