es-shims / es5-shim

ECMAScript 5 compatibility shims for legacy (and modern) JavaScript engines
MIT License
7.12k stars 895 forks source link

Math.round issues #288

Open Yaffle opened 9 years ago

Yaffle commented 9 years ago

see https://twitter.com/BrendanEich/status/360832908514181122

1) Math.round(0.5 - Number.EPSILON / 4) should be equal to 0

2) Math.round((2 / Number.EPSILON + 1) / 2 + 1) should be equal to (2 / Number.EPSILON + 1) / 2 + 1 Math.round(2 / Number.EPSILON) should be equal to 2 / Number.EPSILON

The ES5 spec - http://es5.github.io/#x15.8.2.15 - says, that Math.round "Returns the Number value that is closest to x and is equal to a mathematical integer", but Note 2 says nothing about Note 2 was fixed in ES6 - https://people.mozilla.org/~jorendorff/es6-draft.html#sec-math.round

Some browsers have good implementaions (FF 35, Chrome ?): https://bugzilla.mozilla.org/show_bug.cgi?id=622348 https://bugzilla.mozilla.org/show_bug.cgi?id=1000606

But IE 11, Opera 12, Safari are buggy here.

I think, the implementation may look like this:

Math.round = function (x) {
  var n = Number(x);
  var ceil = Math.ceil(n);
  return ceil  - (ceil - 0.5 > n ? 1 : 0);
};
ljharb commented 9 years ago

Addressed by https://github.com/es-shims/es6-shim/commit/90c803f68390dd13fd5297b1e2d54d44f8dac94b

ljharb commented 9 years ago

Sorry, that was in the es6-shim. The es5 parts need to be addressed here.