将浮点数拆分为3个其他数字

时间:2016-09-19 12:49:37

标签: javascript math

我有一个介于0和16之间的浮点数581 375,我需要将这个数字拆分为0到255之间的3,它等于将它们相乘后的结果。

示例:

  • 255变为=> 1 * 1 * 255
  • 1275变为=> 1 * 5 * 255
  • 7152750 = => 110 * 255 * 255

以下是我获得3个数字的方法:

var MAX = 255*255*255;

function getNumbersFromValue( v ){

  v = Math.max(0, Math.min(MAX, v)) || 0;

  if( v <= 255 ){

    return {
      r: 1,
      g: 1,
      b: v
    };

  }
  else if( v <= (255 * 255) ){

      return {
        r: 1,
        g: (v / 255),
        b: 255
      };

  }
  else {

    return {
      r: (v / 255 / 255),
      g: 255,
      b: 255
    };

  };

};

我的问题是我需要三个数字是整数而不会丢失精度(或无关紧要的东西),起始值(示例中的变量v)可以是0到16之间的浮点数581 375(255 * 255 * 255 )。

2 个答案:

答案 0 :(得分:0)

您可以使用carmickranswer将整数转换为rgb值。

function go(rgb) {
    return {
       r: (rgb >> 16) & 0xFF,
       g: (rgb >> 8) & 0xFF,
       b: rgb & 0xFF
    };
}

console.log(go(255));
console.log(go(257));
console.log(go(1275));
console.log(go(4711));
console.log(go(7152750));
console.log(go(7152751));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

将答案编码数据更新为RGB值

您可以使用RGB值中的24位数据对整数进行编码和解码,如下所示:

function numToRGB(num){ //num is integer in range 0 through 16777215
  return {
    r: (num >> 16) & 0xff,
    g: (num >> 8) & 0xff,
    b: num & 0xff
  }
}

function RGBtoNum(rgb){
  return rgb.r << 16 ^ rgb.g << 8 ^ rgb.b;
}

console.log(numToRGB(0xffffff));

console.log(RGBtoNum({
  r: 255,
  g: 255,
  b: 255
}));

理论上你可以使用RGBA在每个像素中编码32位,但是this is not stable

回答原始问题

根据您描述的限制,

  • 起始值为浮点数,范围为0到16 581 375,
  • 分为三个组成部分,每个组成部分的范围为0到255,
  • 组件的产品应与起始值相对应,
  • 组件只能是整数,

只有764种可能的组合唯一映射到起始值范围(0到16 581 375)中的值:

  • 0×0×0
  • 1×1×(1到255)
  • 1×(2到255)×255
  • (2到255)×255×255

不可能从任何可能的起始值中提取组件而不会丢失精度(假定该范围内的任何浮点值都是有效的起始值)。我们能做的最好的就是四舍五入到最接近的比赛。例如,根据约束,数字185 694没有整数解。但是,它比130 050(2×255×255)更接近195 075(3×255×255)。

以下是在代码中执行此操作的一种方法:

function extract(v) {
  if (v === 0) return {
    r: 0,
    g: 0,
    b: 0
  };
  for (var rgb = [], i = 3; i--; v /= 255)
    rgb[i] = Math.max(1, Math.min(Math.round(v), 255));
  return {
    r: rgb[0],
    g: rgb[1],
    b: rgb[2]
  };
}

/* test 185 694 */
console.log(extract(185694));

由于您的代码示例似乎表明您使用的是24位rgb颜色,因此了解有关问题上下文的更多信息会很有帮助。为什么起始值是浮点数?为什么范围是0到16 581 375?

为了编码764种可能的组合,从0到763的整数范围就足够了。对于任何24位rgb值的编码,约束不适合 - 它们仅允许非常有限的可能rgb值子集(<0.01%)。