【发布时间】: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
【问题讨论】:
-
我投票决定重新打开它,因为问题实际上与精度无关。这是关于小端字节序与大端字节序的对比。
-
这里的表示可以是 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