2

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

这里有一些例子:

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 转换为十六进制的来源。

4

2 回答 2

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),但在那之后,我们只需在 (binary) 处停止1.1,因为1 + 0.5(decimal) = 1.5(decimal) = 1.1000(binary)。

我在其中添加了一些额外的零以使下一次转换更容易,因为接下来我们将那块四位数据转换为十六进制,即简单的1.8.

于 2013-09-30T20:00:10.527 回答
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,结转 0.4)
  • .4 * 16 = 6.4 ---> 十六进制值0.26(保留 6,结转 0.4)
  • .4 * 16 = 6.4 ---> 十六进制值0.266(保留 6,结转 0.4)
  • .4 * 16 = 6.4 ---> 十六进制值0.2666(保留 6,结转 0.4)
  • . . . .

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

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

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

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

一旦你稍微了解一下,它实际上很有意义,但它肯定不是乍一看就清楚地呈现出来的东西。:)

于 2013-09-30T20:35:23.557 回答