Точность большого числа в Javascript - PullRequest
0 голосов
/ 19 марта 2019

Я занимаюсь практикой показа большого числа с факториалом.Проблема в том, что он всегда округляется автоматически, когда результат слишком велик.Вот пример:

function extraLongFactorials(n) {
    const rs = [...Array(n)].reduce((a, b, i) => a*(i+1), 1);
    console.log(rs);
}

extraLongFactorials(25);

Результат вышеприведенного кода:

1.5511210043330986e + 25

Когда ожидаемый результат равен

15511210043330985984000000

Я пытаюсь с toFixed() и toLocaleString('fullwide', {useGrouping: false}), но оба дали неверный вывод.

15511210043330986000000000

Кто-нибудь знает, как справиться с этой ситуацией?

Ответы [ 3 ]

2 голосов
/ 19 марта 2019

Это должно работать во всех браузерах, которые в настоящее время поддерживают BigInt.Обратите внимание, что операции между BigInt и Number не смешиваются, поэтому мы должны начать с BigInt в первую очередь (обратите внимание на символ n в 1n).rs.toString() требуется StackSnippet, потому что он подделывает консоль, а поддельная консоль все еще не знает, как напечатать несколько новых типов данных из ES6 +;настоящая консоль будет знать, как печатать BigInt нормально.

function extraLongFactorials(n) {
    const rs = [...Array(n)].reduce((a, b, i) => a*(BigInt(i+1)), 1n)
    console.log(rs.toString())
}

extraLongFactorials(25)

Если ваш браузер не поддерживает BigInt, тогда ... тогда ... получите лучший браузер (или используйте библиотеку, подобную * 1013)* это , я полагаю. Но лучше браузер.)

1 голос
/ 19 марта 2019

Используйте BigInt, если ожидаемое число больше чем Number.MAX_SAFE_INTEGER

Просмотрите Фрагмент , если ищете что-то без BigInt и каких-либо ограничений поддержки.

function extraLongFactorials(n) {
	const rs = [...Array(n)].reduce((a, b, i) => a*(i+1), 1)
	console.log('output-'+BigInt(rs))
}
console.log(Number.MAX_SAFE_INTEGER)
extraLongFactorials(25)
1 голос
/ 19 марта 2019

Вы можете использовать BigInt:

function extraLongFactorials(n) {
  const rs = [...Array(n)].reduce((a, b, i) => a * Bigint(i + 1), 1 n);
  console.log("" + rs)
}

extraLongFactorials(25);

Обратите внимание, что этот код работает не во всех браузерах, поскольку находится на стадии 3 разработки.Он может быть добавлен в ECMAScript 9 в конце этого года, что сделает его полноценным (хотя не все браузеры будут его поддерживать).

...