【问题标题】:Parseint – truncating with e+Parseint – 用 e+ 截断
【发布时间】:2019-08-03 11:19:27
【问题描述】:

我在内部使用parseInt() 将一个值转换为我现在想用toString() 转换为另一个数字系统。

parseInt(value, 10).toString(16) 

但由于整数被截断(即1.7956279830335669e+47),我无法获得所需的十六进制表示。

还有其他方法可以将字符串转换为 int 吗?
我该如何解决这个问题?

【问题讨论】:

  • 改用NumberNumber('1.7956279830335669e+47') 。或者1.7956279830335669e+47是哪个值?
  • @FelixKling,解析int返回的数字,现在用e+截断了
  • value 的值是多少?

标签: javascript ecmascript-6 numbers hex parseint


【解决方案1】:

尝试(在支持 BigInt 的 chrome 上工作)

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

但是使用这种方法我们会降低精度,但我们可以使用替代方法,将指数形式的数字转换为整数形式

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.7956279830335669e+47"。使用Number(value) 仍然会降低精度。
【解决方案2】:

使用BigInt:

BigInt(value).toString();

您需要它,因为 JavaScript 可以支持的最大 Number9007199254740991

console.log(Number.MAX_SAFE_INTEGER);

您可以使用 BigInt,因为它是一个内置的全局对象,但它不是一个完全支持的 ECMAScript 功能 - 目前它处于开发的第 3 阶段。

【讨论】:

  • 你也可以链接到图书馆吗?此外,详细说明他们应该使用它的原因对任何未来的访问者都有帮助。
  • 是的,对不起@FelixKling。
猜你喜欢
  • 2014-09-19
  • 2015-02-07
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2023-03-31
  • 2018-10-12
  • 2018-06-18
相关资源
最近更新 更多