Преобразовать число в BigInt или String, если его значение превышает Number.MAX_SAFE_INTEGER в ECMAScript - PullRequest
0 голосов
/ 02 апреля 2020

Когда мы заранее не знаем числовое значение, можем ли мы преобразовать его в BigInt или String без искажения значения?

const targetNumber: number = 90071992547409946; // suppose we don't know it in advance
function splitEach3DigitsGroupWithComma(targetNumber: number | bigint | string): string {
  if(targetNumber > Number.MAX_SAFE_INTEGER) {
    // targetNumber = BigInt(targetNumber); // 90071992547409952n
    // targetNumber = String(targetNumber); // 90071992547409950
    // We need to do something before proceed!
  }

  return String(targetNumber).replace(/\B(?=(?:\d{3})+(?!\d))/gu, ",");
}

1 Ответ

1 голос
/ 02 апреля 2020

Если targetNumber уже не является ни BigInt, ни строкой в ​​том месте, где вы впервые можете с ним работать, тогда это обычное число - и в этом случае оно может быть только настолько точным, насколько может быть число, согласно стандарту IEEE 754. Если у вас есть только number для работы, возможные более точные значения уже уже были потеряны ранее.

Чтобы сохранить точность, убедитесь, что значение остается как BigInt или Строка от начала до конца. Если оно преобразуется в number в любое время между ними, а затем это число используется, оно может потерять точность в зависимости от числа.

Другими словами, чтобы сделать что-то подобное, вы нужно начать с что-то вроде

const targetNumber = '90071992547409946';

или

const targetNumber = 90071992547409946n;

Это невозможно сделать в середине процесса, если у вас уже есть только number, сохраняя при этом точность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...