J'utilise parseInt() en interne pour convertir une valeur que je souhaite maintenant convertir en un autre système numérique avec toString().

parseInt(value, 10).toString(16) 

Mais comme l'entier est tronqué (c'est-à-dire 1.7956279830335669e+47) en raison de la longueur, je ne peux pas obtenir la représentation hexadécimale souhaitée de mon nombre.

Existe-t-il un autre moyen de convertir une chaîne en un entier ?
Comment puis-je procéder pour résoudre cela?

1
0TTT0 13 mars 2019 à 00:13

2 réponses

Meilleure réponse

Utilisez BigInt :

BigInt(value).toString();

Vous en avez besoin car le plus grand Number JavaScript pouvant être pris en charge est 9007199254740991 :

console.log(Number.MAX_SAFE_INTEGER);

Vous pouvez utiliser BigInt car il s'agit d'un objet global intégré, mais ce n'est pas une fonctionnalité ECMAScript entièrement prise en charge - elle est actuellement à l'étape 3 de développement.

2
Jack Bashford 12 mars 2019 à 22:04

Essayez (fonctionne sur chrome où BigInt est pris en charge)

BigInt(Number(value)).toString(16);

Cependant, en utilisant cette approche, nous perdons de la précision, mais nous pouvons utiliser une approche alternative en convertissant le nombre sous forme exponentielle en nombre entier

let value= "1.7956279830335669e+47";

let sim    = BigInt(Number(value)).toString(16);
let prec   = BigInt(fix2IntStr(value)).toString(16);
let direct = 179562798303356690000000000000000000000000000000n.toString(16);


// convert "exponential" form to integer string
function fix2IntStr(str) { 
  let [m,e] = value.split('e');
  e = e - (m.length - m.indexOf('.')-1);
  m = m.replace('.','');
  return m+"0".repeat(e);
}

console.log('simple :', sim);
console.log('precise:',prec);
console.log('direct :',direct);
1
Kamil Kiełczewski 12 mars 2019 à 22:54