php中的Float.floatToIntBits或以正确的方式在浮点内部传递int值


Float.floatToIntBits in php or the right way pass int value inside a float

我需要从java代码向php传递一个浮点内部的int值。原因是我必须在两者之间使用的第三方API只接受浮点值。

在java中,我有以下代码,可以按预期工作:

int i1 = (int) (System.currentTimeMillis() / 1000L);
float f = Float.intBitsToFloat(t);
int i2 = Float.floatToIntBits(f);
//i1 == i2

然后,我将float.intBitsToFloat()中的float值传递给第三方API,它会用float:向我的服务器发送一个字符串

"value1":1.4237714E9

在php中,我接收并解析许多这样的字符串,并得到一个数组:

{
"value1" => 1.4237714E9, (Number)
"value2" => 1.4537614E9 (Number)
...
}

现在我需要为php中的每个元素制作Float.floatToIntBits(),但我不确定如何制作。这些php数字会有4个字节长吗?或者我可以在解析字符串时以某种方式获得整数?有什么建议吗?提前谢谢!

谢谢大家!是的,我忘了收拾行李了。这不是一个真正的答案,但它适用于我的情况:

function floatToIntBits($float_val)
{
    $int = unpack('i', pack('f', $float_val));
    return $int[1];
}

但反之亦然!奇怪的事情:

$i1 = 1423782793;
$bs =pack('i', $i);
$f = unpack('f', $bs);
//array { 1 => 7600419110912} while should be 7.6004191E12 (E replaced with 109?)
//or may be 7600419110000 which also right, but not 7600419110912!

我无法解释。在家庭系统和服务器(5.5和5.4 php)上进行了双重检查,结果相同。

嗨,我发现你可能不喜欢的员工:

function FloatToHex1($data)
{
    return bin2hex(strrev(pack("f",$data)));
}
function HexToFloat1($data)
{
    $value=unpack("f",strrev(pack("H*",$data)));
    return $value[1];
}

//使用

echo HexToFloat1(FloatToHex1(7600419100000));

给出类似7600419110912 的结果

所以109不是E的替代,问题是用浮点重新计算数字。这听起来很有趣,但PHP重新计算会给你带来最准确的答案。这是一个答案7600419110912

所以阅读这篇文章了解更多信息https://cycling74.com/forums/topic/probably-a-stupid-question-but/