toString(16)带小数点

时间:2013-09-30 19:47:38

标签: javascript tostring

我理解它是二进制的,但我不理解它的十六进制。

以下是一些例子:

Number(0.15).toString(16) // 0.26666666666666
Number(1.5).toString(16) // 1.8
Number(.18).toString(16) // 0.2e147ae147ae14

当转换为十六进制时,小数似乎增加了大约40%,当你从10号基数到16号基数时,这个数字没有任何意义。它应该像整数一样下降,对吧?

如果是/不正确:你怎么用手做?我完全理解转换整数但是当dec值有一个小数时,我没有找到将dec转换为十六进制的源。

2 个答案:

答案 0 :(得分:4)

首先,不要将小数视为“增加约40%”。数字是相等的 - 它们只是使用不同的数字系统来表示。

让我们来看看当你将十进制数转换为二进制数然后转换为十六进制时发生了什么。对我来说,至少,这使它更容易理解:

取十进制数0.15:在二进制数字中,它是0.0010 0110 0110 0110 0110 0110 0110 0110...。 (为了清晰起见,添加了空格。)注意一切有趣吗?如果您将这四个块中的每个块转换为十六进制等值,那么您将获得toString(16)召唤给您的确切内容:0.2666666...(二进制中的0010 =十六进制中的2 )。

为什么会这样?因为在小数点之后,您可以将每个条目视为 2的反幂。意味着小数点后面的每个位代表:

 .1 |  .01 |  .001 |  .0001 |  .00001... (BIN)
0.5 | 0.25 | 0.125 | 0.0625 | 0.03125... (DEC)

那么我们如何在二进制中代表1.5?好吧,小数点之前的所有内容都应该很简单(只是1),但之后,我们只需停留在1.1(二进制),因为1 + 0.5(十进制)= {{1} }(十进制)= 1.5(二进制)。

我在那里添加了一些额外的零以使下一次转换更容易,因为接下来我们将这个四位的块转换为十六进制,这只是1.1000

答案 1 :(得分:2)

我之前从未想过的有趣问题,但经过一些研究后,完全有道理。

如果你想用十六进制表示十进制值24,你可以像这样将值除以16:24/16 = 1,余数8 --->因此十六进制的“16”数字为1,“1”数字为8,最后的十六进制值为18

十进制数的“小数”部分经历了一种类似的过程,但是,除了除以16之外,你乘以16.所以,使用你的例子,你可以逐步完成这个过程:

十进制数0.15 =十六进制数0.26666666666666

  • .15 * 16 = 2.4 --->十六进制值0.2(保持2,结转.4)
  • .4 * 16 = 6.4 --->十六进制值0.26(保持6,结转.4)
  • .4 * 16 = 6.4 --->十六进制值0.266(保持6,结转.4)
  • .4 * 16 = 6.4 --->十六进制值0.2666(保持6,结转.4)
  • 。 。 。

十进制数1.5 =十六进制数1.8

  • 1.5 --->十六进制值1(保持1,结转.5)
  • .5 * 16 = 8 --->十六进制值1.8

十进制数.18 =十六进制数0.2e147ae147ae14

  • .18 * 16 = 2.88 --->十六进制值0.2(保持2,结转.88)
  • .88 * 16 = 14.08 --->十六进制值0.2e(保留14 [或“e”],结转.8)
  • .08 * 16 = 1.28 --->十六进制值0.2e1(保持1,结转.28)
  • .28 * 16 = 4.48 --->十六进制值0.2e14(保持4,结转.48)
  • 。 。 。

一旦你逐步介绍它,它实际上很有意义,但它肯定不是乍看之下清楚呈现的东西。 :)