【问题标题】:PHP convert hex to floatPHP将十六进制转换为浮点数
【发布时间】:2020-07-28 19:28:39
【问题描述】:

您好,我正在尝试将十六进制值转换为浮点数,我使用的方法是

function hex2float($strHex) {
$hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x");
$hex = array_reverse($hex);
$bin = implode('', array_map('chr', $hex));
$array = unpack("dnum", $bin);
return $array['num'];
}

$float = hex2float('4019999a');
echo $float;

输出

它返回的输出是6.4000015258789,但实际上应该是2.4

reference

【问题讨论】:

  • 我投票决定重新打开它,因为问题实际上与精度无关。这是关于小端字节序与大端字节序的对比。
  • 这里的表示可以是 2.4 或 6.33,具体取决于字节序。例如,var_dump(unpack('G*', hex2bin('4019999a'))[1]); 给你float(2.4000000953674)var_dump(unpack('g*', hex2bin('4019999a'))[1]); 给你float(-6.3320110435437E-23)。一个是小端,另一个是大端。
  • @Sherif 我怎样才能得到准确的2.4,因为这个值是从客户端机器发送的?
  • 在浮点数学中没有精确值这样的东西。这就是我们有精确设置的原因。单精度浮点数只有 7 位精度,而双精度浮点数(PHP 在内部将值转换为)具有 15 位精度。您采用单精度浮点数并将其存储在双精度浮点数中。额外的数字来自于您的单精度浮点数太小,不适合双精度浮点数。请注意,在 4 之后正好有 6 个零。

标签: php floating-point hex yii2-advanced-app


【解决方案1】:

您的问题是您正在以小端字节顺序解释值。这会给您错误的6.4 值,实际上是-6.3320110435437E-23。此外,您将其解压缩为双精度浮点数。它不是。它是单精度的(只有 4 个字节宽)。

function hex2float($strHex) {
    $hex = sscanf($strHex, "%02x%02x%02x%02x%02x%02x%02x%02x");
    $bin = implode('', array_map('chr', $hex));
    $array = unpack("Gnum", $bin);
    return $array['num'];
}

$float = hex2float('4019999a');
echo $float;

这为您提供了正确的 2.4 值。

更简单的方法是var_dump(unpack('G', hex2bin('4019999a'))[1]);,它也可以为您提供正确的值。

【讨论】:

  • 不用sscanf()implode(),直接$bin = hex2bin($strHex);即可。
  • @Sherif 我得到的值是2.4000000953674,但是从客户端传递过来的实际值是2.4
  • 是的,它们的值相同。 2.4000000953674 舍入到 2.4。欢迎使用浮点运算。
猜你喜欢
  • 2014-03-01
  • 2010-12-08
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多