繁体   English   中英

PHP在二进制,八进制,十进制和十六进制之间使用浮点数进行转换

[英]PHP conversions between binary, octal, decimal and hexadecimal with floating number

我想在二进制,八进制,十进制和十六进制数之间转换浮点数(例如152.35964)。

我用谷歌搜索,但没有找到与我想要的东西有关的任何东西。 我发现的所有内容都在文档中,但是这些函数(bindec(),octdec(),binhex()等和base_convert())仅使用整数操作,我需要浮点数或双精度数。

谢谢!

在PHP手册的此页面上查看Nstiac的帖子 他提供了一对例程,用于将浮点数转换为IEEE 754单精度32位及其反向。

对于您引用的152.35964示例,它显示的十六进制值为“ 43185c11”。 这是您期望看到的吗?

或该逻辑的替代版本:

$value = 152.35964;
var_dump($value);

$packedValue = pack('f',$value);

$packedLength = strlen($packedValue);
$packedHexDisplay = '';
for($i = $packedLength-1; $i >= 0; --$i) {
    $packedHexDisplay .= str_pad(dechex(ord($packedValue[$i])),2,'0',STR_PAD_LEFT);
}
var_dump($packedHexDisplay);

$unpackedValue = unpack('f',$packedValue);
var_dump($unpackedValue);

困难的方法:

$signmap = Array(
  -1 => '-',
  1 => ''
);

function fractur($f)
{
  if ($f < 0)
  {
    $sign = -1;
    $f = -$f;
  } else {
    $sign = 1;
  };
  $intp = floor($f);
  $fracp = $f - $intp;
  return Array($sign, $intp, $fracp);
};

function float2var($f, $spec)
{
  global $signmap;
  list($sign, $intp, $fracp) = fractur($f);
  $format = sprintf('%%s%s.%s', $spec, $spec);
  $ret = sprintf($format, $signmap[$sign], $intp, $fracp * 16777216);
  // 64-bit systems can use the next line instead
  //$ret = sprintf($format, $signmap[$sign], $intp, $fracp * 18014398509481984);
  return rtrim(rtrim($ret, '0'), '.');
};

function float2bin($f)
{
  return float2var($f, '%b');
};

function float2oct($f)
{
  return float2var($f, '%o');
};

function float2hex($f)
{
  return float2var($f, '%x');
};

var_dump(float2bin(10.5));
var_dump(float2bin(10));
var_dump(float2bin(-2.5));
var_dump(float2bin(2.5));
var_dump(float2oct(2.5));
var_dump(float2hex(2.5));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM