【问题标题】:PHP hexdec. How to avoid unexpected round down?PHP 十六进制。如何避免意外的四舍五入?
【发布时间】:2018-05-06 01:07:32
【问题描述】:

似乎 hexdec 会自动向下舍入。我想避免它。我该怎么做?我使用 PHP7。

<?php
$hex = '0x6252f8774def5e344';
$decimal = hexdec($hex);
echo $decimal; // 1.1335997368159E+20

result:113359973681590000000
expect:113359973681592656708

更新 1

这可能是类似的问题。 Large hex values with PHP hexdec


更新 2(给我的备忘录)

Ivan 提到了 gmp,以下数学扩展可能有用。

数学扩展 http://php.net/manual/en/refs.math.php

【问题讨论】:

  • 这似乎是浮点数的问题,你可以试试base_convert('6252f8774def5e344', 16, 10)
  • @MatteoTassinari 谢谢。我正在检查 base_convert。
  • 关于你的“更新 1”,是的,似乎是重复的,所以如果你保留它,它可能会被关闭。
  • base_convert不起作用!请看下面我的回答

标签: php


【解决方案1】:

你应该使用GMP functions:

GMP gmp_init (mixed $number [, int $base = 0])

对于您的问题:

echo gmp_init ( '6252f8774def5e344',16);

base_convert('6252f8774def5e344', 16, 10) 这样的解决方案将不起作用 => php.net: base-convert

base_convert() 由于与使用的内部“double”或“float”类型相关的属性,可能会丢失大数的精度。有关更多具体信息和限制,请参阅手册中的浮点数部分。

【讨论】:

  • 谢谢。我现在正在尝试。
  • @zono 可以吗?你能调用函数gmp_init吗?问题解决了吗?
  • @lvan 还没有。看来我需要安装它。我现在正在调查。我会让你知道结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多