【问题标题】:Why is Math.pow(16, 6) not equal to parseInt(0xFFFFFF, 10)?为什么 Math.pow(16, 6) 不等于 parseInt(0xFFFFFF, 10)?
【发布时间】:2015-04-28 05:35:57
【问题描述】:

我正在处理 CSS 颜色和十六进制编码。白色以 CSS RGB 表示法表示为十六进制 #FFFFFF,或 Javascript 中的 0xFFFFFF。

如果我理解正确,十六进制数中的每个位置都是从 0 到 16。所以一系列六个 F 等于 16 * 16 * 16 * 16 * 16 * 16,或 16 的 6 次方:数学.pow(16, 6)。此操作的结果是 16777216。

我们还可以将十六进制值解析为以 10 为底:parseInt(0xFFFFFF, 10)。此操作的结果是 16777215。

为什么这两个操作相差1?

【问题讨论】:

  • 比较 999 和 10*10*10。
  • 你为什么要解析以 10 为底的0xFFFFFF?你的意思是parseInt("0xFFFFFF", 16)
  • @p.s.w.g 好奇心,而非实际需要。
  • @OliverCharlesworth 我知道范围 [0 到 999] 包含 1000 个不同的值。但是我们有六个十六进制位置,可以从 0 开始,每个位置最多 16 个。
  • 原因完全一样,只是基数不同。

标签: javascript css hex rgb


【解决方案1】:

在十六进制中,F = 15,而不是 16,将 F 相邻 n 次将导致 16^n - 1 类似于将 9 相邻 n 次将导致 10^n -1。

这就是为什么会有区别。

【讨论】:

    【解决方案2】:

    让我们从一个十进制数开始。

    99999910 不等于 106

    99999910 小于 106

    99999910 = 9 × 105 + 9 × 104 + 9 × 103 + 9 × 102 + 9 × 101 + 9 × 100

    6位数字可用于表示106个不同的数字:0到99999910


    十六进制相同。

    FFFFFF16 不等于 166

    FFFFFF16 比 166 小一。

    FFFFFF16 = 15 × 165 + 15 × 164 + 15 × 163 + 15 × 162 + 15 × 161 + 15 × 160

    6 个十六进制数字可用于表示 166 个不同的数字:0 到 FFFFFF16

    【讨论】:

    • 是的,同时通过以前的 cmets/answers 的提示想通了。不过,感谢您的彻底回答。
    猜你喜欢
    • 2017-05-31
    • 2016-05-28
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2017-01-01
    • 2015-04-08
    • 2011-03-01
    相关资源
    最近更新 更多