我正在尝试在php中打印40位数字。但是,当使用Windows计算机时,它仅允许使用32位整数,这导致我的代码回显了错误的结果。以下代码示例:
function decoded_microchip_id($coded_string) {
$manufacturer = substr($coded_string, 0, 3);
$manufacturer = hexdec($manufacturer);
$manufacturer = $manufacturer / 4;
$device_id = substr($coded_string, 2, 11);
$device_id = hexdec($device_id);
$device_id = $device_id & 0x3fffffffff;
echo $manufacturer.'.'.$device_id;
};
decoded_microchip_id('f58e29a43c67');
上面的代码的正确输出是:982.60828171367
但是在我的32位Windows环境中,我得到了:982.698629223
在各种PHP沙箱中测试代码时,输出也会有所不同。
这是一个沙盒环境示例,为我提供了正确的输出:http : //sandbox.onlinephpfunctions.com/code/83cc28fd5314557e7a9d86d8061e1c8dfae4d1b7
以下是产生错误输出的环境的示例:http : //codepad.org/m2ygOgC6
有谁知道解决这个问题的方法或解决方案。
谢谢。
PHP函数也hexdec()
可以在32位上正常工作。文档说,float
当结果不适合32位时,它将产生数字。
有趣的是,0x3fffffffff
它也存储为float
数字。
罪魁祸首是&
似乎产生整数的按位运算符()。将其结果转换为float并没有帮助,损坏已经完成。
该行为记录在案:
两个操作数都将转换为整数,结果将为整数。
您可以尝试将输入字符串拆分成适合32位的部分,并在它们上使用按位运算符,然后使用加法和乘法来生成最终值(如果不能容纳32位,则加法和乘法会将结果转换为浮点型)。
对于这种情况,一种更简单的解决方案是将十六进制字符串转换为其编码数字的二进制表示形式,提取每个组件所需的位,然后将值转换为十进制。在这种情况下,不涉及位操作(除了转换,但这些转换似乎正常工作)。
function decoded_microchip_id($coded_string)
{
// Convert to binary
$bin = base_convert($coded_string, 16, 2);
// Split to 10/38 bits
$manufacturer = substr($bin, 0, 10);
$device_id = substr($bin, 10, 38);
// Convert to decimal
$manufacturer = bindec($manufacturer);
$device_id = bindec($device_id);
// Put pieces back
return $manufacturer.'.'.$device_id;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句