【问题标题】:Number.prototype.toString (for floats) implementationNumber.prototype.toString(用于浮点数)实现
【发布时间】:2021-06-26 12:33:27
【问题描述】:

我最近发现您可以在带有基数的 JS 中对浮点数调用 toString(),但我对它的实现感到困惑。例如,JS 中的3.1459.toString(16),返回3.2559b3d07c84c。从我的测试来看,数字部分似乎是到等效基数的直接转换,但这不适用于小数部分?字符究竟是如何确定的?

我在 V8 中找到了我认为的 source。它类似于 cmets 中关于将分数转换为十六进制的内容,但存在额外的舍入和精度差异。

【问题讨论】:

  • 这个问题是关于 JavaScript 还是 C#?如果问题是关于 toStringNumber 值的实现,我们并不关心您是否尝试移植到 C#,除非您只想要 C# 代码方面的答案。
  • 对不起,含糊不清,我不介意代码,但我删除了 C# 标签,因为它更适合 JS 本身。
  • MDN 上没有任何关于如何转换小数的详细信息。查看the spec 它说“精确算法是实现定义的,但是该算法应该是 6.1.6.1.20 中指定的算法的概括。”并链接到this section 但我去斗鸡眼试图阅读和理解它。
  • 有点相关 - 最近有一个关于规范的那部分的问题:Number::toString() abstract operation。但是,到目前为止还没有答案。
  • 另一个相关问题,与语言无关的问题:How to convert decimal fractions to hexadecimal fractions?

标签: javascript node.js


【解决方案1】:

如果您正在寻找将小数部分转换为不同的基数系统,您可以将小数部分与基数相乘,以基数形式获取整数值并执行相同的操作,直到您得到零或得到一个限制数字。

let frac10 = 0.1459,
    frac16 = '',
    limit = 15;

while (frac10 && --limit) {
    const integer = Math.floor(frac10 *= 16);
    frac16 += integer.toString(16);
    frac10 -= integer;
}

console.log(frac16);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2022-12-19
相关资源
最近更新 更多