javascript浮动/到位

时间:2010-01-05 01:08:27

标签: javascript types

我正在尝试用任何其他语言执行一些简单易懂的东西但不是javascript:从浮动中获取这些内容(反之亦然)。

在C / C ++中它会像

float a = 3.1415;
int b = *((int*)&a);

反之亦然

int a = 1000;
float b = *((float*)&a);

在C#中,您可以使用BitConverter ...在Java中使用floatBits或类似的东西......即使在VB6中,为了基督的缘故,你也可以将一个float32存入一个int32。我怎么能在javascript中转换和int和浮点数?

5 个答案:

答案 0 :(得分:20)

function DoubleToIEEE(f)
{
    var buf = new ArrayBuffer(8);
    (new Float64Array(buf))[0] = f;
    return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ];
}

答案 1 :(得分:10)

你当然不会像JavaScript那样得到任何低级别的东西。允许以不受信任的潜在攻击者网站使用的语言进行重铸和指针擦除将是非常危险的。

如果你想获得一个数字中的单精度值的32位IEEE754表示(记住也不是int;你在JavaScript中获得的唯一数字类型是double),你将必须通过摆弄符号,指数和尾数位来自己做。有示例代码here

答案 2 :(得分:2)

function FloatToIEEE(f)
{
    var buf = new ArrayBuffer(4);
    (new Float32Array(buf))[0] = f;
    return (new Uint32Array(buf))[0];
}

不幸的是,这不适用于双打和旧浏览器。

答案 3 :(得分:0)

  1. JavaScript使用double(IEEE 754)代表所有数字
  2. double由[符号,指数(11位),尾数(52位)]字段组成。 数字的值使用公式(-1)^sign * (1.mantissa) * 2^(exponent - 1023)计算。 (1.mantissa - 表示我们在开头加上一些尾数加1,并将该值作为数字,例如,如果尾数= 101,我们得到数字1.101 (bin) = 1 + 1/2 + 1/8 (dec) = 1.625 (dec)
  3. 如果number大于零,我们可以获得sign位测试的值。此处0存在一个小问题,因为double+0-0值,但我们可以通过计算1/value并检查值是否来区分这两者+Inf-Inf
  4. 1 <= 1.mantissa < 2开始,我们可以使用Math.log2获取指数值,例如Math.floor(Math.log2(666.0)) = 9所以指数为exponent - 1023 = 9exponent = 1032,二进制为(1032).toString(2) = "10000001000"
  5. 在我们得到指数之后,我们可以将数字缩放到零指数而不改变尾数value = value / Math.pow(2, Math.floor(Math.log2(666.0))),现在值代表数字(-1)^sign * (1.mantissa)。如果我们忽略符号并将其乘以2^52,我们得到的整数值与1.mantissa具有相同的位:((666 / Math.pow(2, Math.floor(Math.log2(666)))) * Math.pow(2, 52)).toString(2) = "10100110100000000000000000000000000000000000000000000"(我们必须忽略前导1)。
  6. 经过一些字符串连接,你会得到你想要的东西
  7. 这只是概念证明,我们没有讨论非规范化数字或特殊值,例如NaN - 但我认为它也可以扩展以解释这些情况。

    @bensiu答案很好,但如果发现自己使用了一些旧的JS解释器,你可以使用这种方法。

答案 4 :(得分:-1)

就像其他海报所说的那样,JavaScript是松散类型的,因此数据类型与float之间没有区别,反之亦然。

但是,你要找的是

float to int:

Math.floor( 3.9 ); // result: 3 (truncate everything past .) or
Math.round( 3.9 ); // result: 4 (round to nearest whole number)

取决于您的喜好。在C / C ++中,它基本上是使用Math.floor从float转换为整数。

int to float:

var a = 10;
a.toFixed( 3 ); // result: 10.000