json-bigint icon indicating copy to clipboard operation
json-bigint copied to clipboard

Unable to parse values larger than 1.7976931348623157E+308

Open SebastianG77 opened this issue 7 years ago • 7 comments

Hi,

when trying to parse a JSON-String which contains a very very big number, I get the following error message: "Bad number". The reason is, that you use isFinite() to check if the number is a finite one. However, according to the specification, Infinity is determined, as following:

"Infinity is displayed when a number exceeds the upper limit of the floating point numbers, which is 1.797693134862315E+308."

As a result, whenever a numeric value that will be parsed is larger than 1.797693134862315E+308, json-bigint is unable to parse the JSON file.

Nevertheless, bignumber.js also has a function isFinite(), which is able to handle values larger than 1.797693134862315E+308. Since from my point of view, this module should be used to parse JSON-files containing any numeric value, I would appreciate if the currently used function isFinite() will be replaced by the function isFinite() of bignumber.js. Find the different results of these function in the following example:

const BigNumber = require('bignumber.js');

console.log(isFinite(1.797693134862316E+308)) // false

console.log(BigNumber('1.797693134862316E+308').isFinite()) //true

I also added a small example, where you can see the value 3e+500 will not be parsed appropriately with json-bigint. However, when using the standard JSON parser, the value can be parsed, even though the returned value is of course incorrect.

var JSONbig = require('json-bigint')

let veryBigDecimal = `3e+500`

try {
    let jsonBigResult = JSONbig.parse(veryBigDecimal)
    console.log(`JSONbig result: ${jsonBigResult.toString()}`)
} catch (e) {
    console.log(`JSONbig error thrown: ${e.message}`)
}

try {
    let jsonResult = JSON.parse(veryBigDecimal)
    console.log(`JSON result: ${jsonResult.toString()}`)
} catch (e) {
    console.log(`JSON error thrown: ${e.message}`)
}

SebastianG77 avatar Nov 19 '18 20:11 SebastianG77

Hi @SebastianG77 , your suggestions seem good to me. Would you be able to volunteer to make this change and submit PR?

sidorares avatar Nov 20 '18 00:11 sidorares

Alright, I can fix it, but I am not sure whether I will be able to do it before next weekend. Will send you a pull request as soon as I finished.

SebastianG77 avatar Nov 20 '18 08:11 SebastianG77

I also ran into this error :/

Almenon avatar Mar 16 '19 20:03 Almenon

but this error would dissapear with native bignumbers right? @nickkolok do you still get this error in your PR?

Almenon avatar Mar 16 '19 20:03 Almenon

@Almenon I'm afraid no.

> BigInt("1e+500");
Thrown:
SyntaxError: Cannot convert 1e+500 to a BigInt
> BigInt("1E+1");
Thrown:
SyntaxError: Cannot convert 1E+1 to a BigInt

nickkolok avatar Mar 16 '19 20:03 nickkolok

@Almenon I believe that the appropriate solution is to pass any number-like string to a user-defined function and the deal with the stuff which the function returns.

nickkolok avatar Mar 16 '19 20:03 nickkolok

Hey guys,

I am afraid I might lack of context regarding your discussion, but I also fixed this error in this PR: https://github.com/sidorares/json-bigint/pull/26 . I also published my changes to npm (https://www.npmjs.com/package/true-json-bigint) as I needed them at that time. Feel free to try them out and give some feedback. Let me know if your problems still appear while using this package.

SebastianG77 avatar Mar 17 '19 11:03 SebastianG77