我需要从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/