我正在尝试在php中将一个64位浮点数转换为64位整数(反之亦然)。我需要保留字节,因此我使用pack和unpack函数。我需要的功能基本上类似于Java的Double.doubleToLongBits()方法。http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#doubleToLongBits(double)
通过查阅php pack()文档中的评论,我已经做到了这一步。
function encode($int) {
$int = round($int);
$left = 0xffffffff00000000;
$right = 0x00000000ffffffff;
$l = ($int & $left) >>32;
$r = $int & $right;
return unpack('d', pack('NN', $l, $r))[1];
}
function decode($float) {
$set = unpack('N2', pack('d', $float));
return $set[1] << 32 | $set[2];
}
而且这在大多数情况下都运作良好……
echo decode(encode(10000000000000));
一亿
echo encode(10000000000000);
1.1710299640683E-305
但是这里就变得棘手了......
echo decode(1.1710299640683E-305);
-6629571225977708544
我不知道这里出了什么问题。请自行尝试:http://pastebin.com/zWKC97Z7
您需要在Linux上使用64位PHP。该网站似乎模拟了这种设置:http://www.compileonline.com/execute_php_online.php
echo encode(10000000000000) - 1.1710299640683E-305; // 2.3525429792377E-319
那么问题是,你是否希望字符串是100%准确的? - Andrewprintf
和 php.ini 的precision=
时取得了一些成功。然而,我决定从现在开始在使用 PHP 时远离类型转换。 - kryo