Почему JavaScript добавляет дополнительный ненулевой номер в конце проанализированного числа - PullRequest
0 голосов
/ 30 августа 2018

Когда я запускаю, Number(123456789012345.12).toFixed(3), он возвращает "123456789012345.125" в виде строки. Откуда поступают последние 5 (в десятичной)? Я бы ожидал, что он вернется "123456789012345.120". Я выполнил этот код на Mac с процессором Intel, используя Chrome версии 68.

1 Ответ

0 голосов
/ 30 августа 2018

Ваш номер слишком длинный (имеет слишком много цифр), он не вписывается в 64-разрядную точность с плавающей запятой для числа JavaScript.

Ниже приведен пример использования меньшего количества цифр:

Number(123456789012345.12).toFixed(3):  '123456789012345.125'
Number(12345678901234.12).toFixed(3):    '12345678901234.119'
Number(1234567890123.12).toFixed(3):      '1234567890123.120'
Number(123456789012.12).toFixed(3):        '123456789012.120'
Number(12345678901.12).toFixed(3):          '12345678901.120'

Числа JavaScript представлены 64-битным значением с плавающей запятой.

Невозможно представить номер, который вы показываете, используя обычные числа JavaScript. Вам нужно реализовать что-то вроде bignumber.js .

Если вы используете bignumber.js, вы можете сделать то же самое, используя следующее:

let BigNumber = require('bignumber.js');
BigNumber('123456789012345.12').toFixed(3):  '123456789012345.120'
BigNumber('12345678901234.12').toFixed(3):    '12345678901234.120'
BigNumber('1234567890123.12').toFixed(3):      '1234567890123.120'
BigNumber('123456789012.12').toFixed(3):        '123456789012.120'
...