Allen Wirfs-Brock (2013-07-12T17:48:41.000Z)
On Jul 12, 2013, at 10:27 AM, Tab Atkins Jr. wrote:

> On Fri, Jul 12, 2013 at 10:19 AM, Mark S. Miller <erights at google.com> wrote:
>> No. Even if toInteger meant "no fractional component", I would still expect
>> it only to return true if there is some specific mathematical integer that
>> the JS number can be said to exactly represent. For the same reason, I think
>> isInteger(-0) should be true and isInteger(NaN) should be false.
> 
> Agreed.  isInteger() has one job, and it's kinda worthless if it can't
> even do that.  How it should be:
> 
> Number.isInteger(-0) == true
> Number.isInteger(NaN) == false
> Number.isInteger(Infinity) == false
> 
> And, because of what we discussed in the recent thread...
> 
> Number.isInteger(Math.pow(2,53)-1) == true
> Number.isInteger(Math.pow(2,53)) == false

In other words you want to define Number.isInteger to return true only if it's argument is an integer number in the range -(2^53-1)..2^53-1

That's a useful test and a plausible definition of Number.isInteger but it will also probably be surprising to programmers who are familiar with the esoterics of IEEE floats. 

If we went that direction what should Number.toInteger do for values outside that range?

Allen
domenic at domenicdenicola.com (2013-07-16T00:30:39.517Z)
On Jul 12, 2013, at 10:27 AM, Tab Atkins Jr. wrote:

> On Fri, Jul 12, 2013 at 10:19 AM, Mark S. Miller <erights at google.com> wrote:
>
>> No. Even if `toInteger` meant "no fractional component", I would still expect
>> it only to return `true` if there is some specific mathematical integer that
>> the JS number can be said to exactly represent. For the same reason, I think
>> `isInteger(-0)` should be `true` and `isInteger(NaN)` should be `false`.
> 
> Agreed.  `isInteger()` has one job, and it's kinda worthless if it can't
> even do that.  How it should be:
> 
> ```js
> Number.isInteger(-0) == true
> Number.isInteger(NaN) == false
> Number.isInteger(Infinity) == false
> ```js
> 
> And, because of what we discussed in the recent thread...
> 
> ```js
> Number.isInteger(Math.pow(2,53)-1) == true
> Number.isInteger(Math.pow(2,53)) == false
> ```

In other words you want to define `Number.isInteger` to return `true` only if it's argument is an integer number in the range -(2^53-1)..2^53-1

That's a useful test and a plausible definition of `Number.isInteger` but it will also probably be surprising to programmers who are familiar with the esoterics of IEEE floats. 

If we went that direction what should `Number.toInteger` do for values outside that range?