Как определяются десятичные разряды в JavaScript?

Я не могу найти, как вычисляется количество десятичных знаков в JavaScript при преобразовании в строку.

Я хочу передавать числа через JSON, но JSON.stringify генерирует разную длину для десятичных знаков.

Например:

JSON.stringify(Math.PI).length // 17 (15 decimal places)
JSON.stringify(1/3).length // 18 (16 decimal places)
JSON.stringify(0.1 + 0.2).length // 19 (17 decimal places)

То же самое происходит, если я конвертирую в строку (например, String(1/3).length), поэтому похоже, что JSON.stringify под обложками преобразуется в строку.

Я пробовал это на chrome, firefox и node, и представление согласовано, поэтому оно не похоже на какую-то причуду консоли.

Вернемся к моему первоначальному вопросу (но немного перефразированному):

Как рассчитывается максимальное количество знаков после запятой в JavaScript при преобразовании числа в строку?


person Artur Carvalho    schedule 26.04.2021    source источник
comment
Он ограничен числовым представлением IEEE 754. Итак, это часть 64 бит, доступных для чисел, и то, как они преобразуются из базы 2 в базу 10 (и странности вокруг этого).   -  person VLAZ    schedule 26.04.2021
comment
Более продуктивный вопрос может состоять в том, чтобы рассказать нам, что вы пытаетесь сделать. Потому что просто знание преобразования базы 2 в базу 10 с плавающей запятой само по себе не так важно.   -  person VLAZ    schedule 26.04.2021
comment
@VLAZ Я хочу понять, как работает язык. Я не понимаю, как связанные вопросы отвечают на то, почему Math.PI имеет 15 знаков после запятой, а 1/3 - 16.   -  person Artur Carvalho    schedule 26.04.2021
comment
Итак, вы хотите пройти полный курс математики с плавающей запятой? Кажется немного широким для SO.   -  person VLAZ    schedule 26.04.2021
comment
Мне нужен неснисходительный ответ, почему String(Math.PI) !== String(Math.LN2).   -  person Artur Carvalho    schedule 27.04.2021