javascript从/到位浮动

javascript从/到位浮动,javascript,types,Javascript,Types,我正在尝试用任何其他语言执行一些非常简单的操作,但不是javascript:从float中提取位(反之亦然) 在C/C++中,它类似于 float a = 3.1415; int b = *((int*)&a); 浮点数a=3.1415; int b=*((int*)&a); 反之亦然 int a = 1000; float b = *((float*)&a); INTA=1000; 浮动b=*((浮动*)&a); 在C#中,可以使用位转换器 …Java中的浮点或类似的东西。。。即使在VB6中,

我正在尝试用任何其他语言执行一些非常简单的操作,但不是javascript:从float中提取位(反之亦然)

在C/C++中,它类似于

float a = 3.1415; int b = *((int*)&a); 浮点数a=3.1415; int b=*((int*)&a); 反之亦然

int a = 1000; float b = *((float*)&a); INTA=1000; 浮动b=*((浮动*)&a); 在C#中,可以使用位转换器
…Java中的浮点或类似的东西。。。即使在VB6中,看在上帝的份上,您也可以将float32记忆为int32。在javascript中,如何在和int和float之间进行转换

在JavaScript中,您当然不会得到任何像这样的低级代码。允许在不受信任的潜在攻击者网站必须安全使用的语言中重铸和指针跳转是极其危险的


如果您想获得一个数字中单个精度值的32位IEEE754表示形式(请记住,它也不是int;JavaScript中唯一的数字类型是
double
),则必须通过将符号、指数和尾数位组合在一起来实现。这里有一些示例代码。

正如其他海报所说,JavaScript是松散类型的,因此从float到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
将浮点转换为整数

要浮动的整数:

var a = 10;
a.toFixed( 3 ); // result: 10.000
不幸的是,这不适用于Double和旧浏览器

function DoubleToIEEE(f)
{
    var buf = new ArrayBuffer(8);
    (new Float64Array(buf))[0] = f;
    return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ];
}
  • JavaScript使用
    double
    (IEEE 754)表示所有数字
  • double
    由[符号、指数(11位)、尾数(52位)]字段组成。 数字的值使用公式
    (-1)^符号*(1.尾数)*2^(指数-1023)
    计算。(
    1.mantissa
    -意味着我们将尾数的位在开头加1,并将该值作为数字处理,例如,如果尾数=
    101
    我们得到数字
    1.101(bin)=1+1/2+1/8(dec)=1.625(dec)
  • 如果数字大于零,我们可以通过测试
    符号
    位的值。这里
    0
    有一个小问题,因为
    double
    +0
    -0
    值,但我们可以通过计算
    1/值
    并检查值是
    +Inf
    还是
    -Inf
    来区分这两个值

  • <> LI>自从代码> 1嘿,只想感谢你问我的问题,我需要知道如何在C++中进行FLATO/INT转换;注释:这样的指针会违反C++中的严格混叠规则。你必须使用MeMCPY。这能回答你的问题吗?只是看看巴巴格.CS.Q.EDU站点中的JavaScript。可能会产生正确的答案,并且可能在在线计算器上工作得很好,但它写得很糟糕&在我看来不适合重用。我不明白为什么将本机IEEE二进制格式转换添加到JavaScript数字或从JavaScript数字添加本机IEEE二进制格式转换将是一个安全问题。没有重铸或指针涉及此问题。@akauppi没有安全问题。只不过是允许Uint8Array、Uint16Array等拥有连续内存而已。只要有一个Float32对象,并给它一个原生方法toUint8Array。它将比现在可用的替代方法更有效。因为javascript中的所有数字都类似于包装在变体中的双倍,这样做的成本基本上是c正在创建数字的内部表示字节的uint8array变体,并将该字节数从数字的内部存储到uint8array的内部内存中。链接似乎已断开。可能要将示例代码添加到答案中?(来自:“始终引用重要链接的最相关部分,以防目标站点无法访问或永久脱机。”)这不是他要找的。他要找的是双精度的二进制表示形式。问题中的“(int*)和a”给出了双精度的机器级(IEEE)位的指针,并指向另一个方向(从字节到浮点),请参阅:。
    function DoubleToIEEE(f)
    {
        var buf = new ArrayBuffer(8);
        (new Float64Array(buf))[0] = f;
        return [ (new Uint32Array(buf))[0] ,(new Uint32Array(buf))[1] ];
    }