2013-09-30 63 views
2

我對二進制瞭解,但我不理解它的十六進制。帶小數點的toString(16)

下面是一些例子:

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

它看起來像小數點當轉換爲十六進制,這並沒有真正意義,當你從底部10將底座16提高了約40%。它應該像整數一樣下降,對吧?

如果它是/不正確的:你如何手工做這件事?我完全理解轉換整數,但我還沒有找到一個來源轉換十進制十六進制時,dec值有一個小數。

+0

你所看到的是二進制數的十六進制表示 - 而這通常是「數字中的位數」。大多數小數不能完全表示爲二進制數。所以你看到「儘可能多的表現」。如果你用十進制打印數字「0.18」,你會看到它繼續下去。 – Floris

+0

@弗洛伊斯我不確定這是否是一個完整的解釋。這不像這些值是一個「小小的」關閉。相反,「看起來十進制在轉換爲十六進制時增加了大約40%」。那麼,非整數轉換的規則是什麼? – user2246674

+0

@Floris所以它本質上是轉換爲二進制,然後採取4組,並直接轉換爲十六進制,對不對? 3.625 = 11.101是二進制的,但是因爲它只是小數點後的一組,所以它將它改變爲11.1010,而後者變成十六進制的3.A。所以這就是它的作用,但是這在數學上是正確的嗎?我不認爲十六進制數應該高於小數。 – Rhyono

回答

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.5(十進制)= 1.1000(二進制)。

我在裏面放了一些額外的零,使得下一次轉換變得更容易,因爲接下來我們把這四位數據塊轉換爲十六進制,這只是1.8

+1

非常好的答案。 – Floris

+0

我沒有得到的是爲什麼零放在右邊而不是左邊?例如。 3.625 = 11.101,因爲小數點後面沒有4位數字,所以在右邊加上一個零,這使得11.1010。這轉換成3.A. A高於6,這會使得看起來好像3.625十進制小於3.A十六進制數。如果將零添加到左側,創建11.0101或3.5會更有意義。 3.5低於3.625並且適合較高的基數。我知道你沒有錯,但似乎倒退了。 – Rhyono

+0

那麼,二進制中的'11.0101'不是十進制的'3.5'。它實際上是'2 + 1 + .25 + .0625 = 3.3125'。零放在左邊,因爲這就是編寫數字的方式,而不管它們的基數。想想這樣:我可以在任意數字的右邊添加任意數量的'0',因爲它不會改變值:'3.14 = 3.140000 ...'但是如果我開始向*右邊添加零*我的數字,壞事發生:'3.14!= 3.014'。不同基地的數字系統的工作原理完全相同,但我們只是在「攜帶」時改變。 – Bucket

2

有趣的問題,我從來沒有想過之前,但經過一點研究,使完全意義。

如果你想用十六進制表示十進制數值24,你可以像這樣將值除以16:24/16 = 1,餘數8 --->所以十六進制中的「16位」數字爲1, 「1」的數字是8,給出最終的十六進制值18

十進制數的「分數」的一部分經歷一種類似的過程,但是,而不是16分,您可以通過16乘所以,用你的例子,你可以通過工藝步驟

十進制數0.15 =十六進制數0.26666666666666

  • 0.15 * 16 = 2.4 --->進制值0.2(保持2,結轉0.4)
  • 0.4 * 16 = 6。4 --->進制值0.26(保持6,結轉0.4)
  • 0.4 * 16 = 6.4 --->進制值0.266(保持6,結轉0.4)
  • 0.4 * 16 = 6.4 --->十六進制值0.2666(保留6,結轉.4)
  • 。 。 。 。

十進制數1.5 =十六進制數1.8

  • 1.5 --->進制值1(保持1,結轉0.5)
  • 0.5 * 16 = 8 --->十六進制值1.8

十進制數.18 =十六進制數0.2e147ae147ae14

  • 0.18 * 16 = 2.88 --->進制值0.2(保持2,結轉0.88)
  • 0.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)
  • 。 。 。 。

一旦你經歷了一段時間,它確實有很大的意義,但它乍看之下確實不是清晰的表現。 :)