我正在尝试用任何其他语言执行一些简单易懂的东西但不是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和浮点数?
答案 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)
double
(IEEE 754)代表所有数字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)
。sign
位测试的值。此处0
存在一个小问题,因为double
有+0
和-0
值,但我们可以通过计算1/value
并检查值是否来区分这两者+Inf
或-Inf
。1 <= 1.mantissa < 2
开始,我们可以使用Math.log2
获取指数值,例如Math.floor(Math.log2(666.0)) = 9
所以指数为exponent - 1023 = 9
和exponent = 1032
,二进制为(1032).toString(2) = "10000001000"
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)。这只是概念证明,我们没有讨论非规范化数字或特殊值,例如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