Крупное шестнадцатеричное число оценивает с PHP hexdec

Как это:

$(document).ready(function ()
{
    document.title = "Hello World!";
});

убедиться установить заголовок по умолчанию, если Вы хотите, чтобы Ваш сайт был правильно индексирован поисковыми системами.

Немного подсказки:

$(function ()
{
    // this is a shorthand for the whole document-ready thing
    // In my opinion, it's more readable 
});
11
задан Peter O. 28 October 2012 в 19:53
поделиться

4 ответа

Как сказано на странице руководства hexdec :

Теперь функция может преобразовывать значения которые слишком велики для платформ целочисленный тип, он вернет значение как float в этом случае.

Если вы хотите получить какое-то большое целое число (не float), вам нужно, чтобы оно было сохранено внутри строки. Это может быть возможно с помощью функций BC Math .

Например, если вы посмотрите комментарии на странице руководства по hexdec, вы найдете это примечание

Если вы адаптируете эту функцию немного, чтобы избежать уведомления, вы получите:

function bchexdec($hex)
{
    $dec = 0;
    $len = strlen($hex);
    for ($i = 1; $i <= $len; $i++) {
        $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));
    }
    return $dec;
}

(Эта функция была скопирована из заметки, на которую я ссылался; и только немного адаптирована мной)

И использовать ее на своем номере:

$h = 'D5CE3E462533364B';
$f = bchexdec($h);
var_dump($f);

Результатом будет:

string '15406319846273791563' (length=20)

Итак, не такой большой, как у вас; и, похоже, все в порядке с тем, что вы ожидаете:

Результат от calc.exe = 15406319846273791563


Надеюсь на эту помощь ;-)
И да, пользовательские примечания к документации PHP иногда являются настоящей золотой жилой; -)

26
ответ дан 3 December 2019 в 01:33
поделиться

hexdec () переключается с int на float, когда результат слишком велик для представления в виде int. Если вам нужны произвольно длинные значения, вам, вероятно, придется использовать собственную функцию преобразования, чтобы изменить шестнадцатеричную строку на целое число GMP .

function gmp_hexdec($n) {
  $gmp = gmp_init(0);
  $mult = gmp_init(1);
  for ($i=strlen($n)-1;$i>=0;$i--,$mult=gmp_mul($mult, 16)) {
    $gmp = gmp_add($gmp, gmp_mul($mult, hexdec($n[$i])));
  }
  return $gmp;
}

print gmp_strval(gmp_hexdec("D5CE3E462533364B"));

Output: 15406319846273791563
4
ответ дан 3 December 2019 в 01:33
поделиться

1.5406319846274E + 19 - это ограниченное представление вашего номера. Вы можете получить более полный, используя printf ()

printf("%u\n", hexdec($h));

... выведет "15406319846273792000". PHP использует числа с плавающей запятой для таких больших чисел, поэтому вы можете немного потерять точность. Если вам нужно работать с числами произвольной точности, вы можете попробовать расширение bcmath . Разделив шестнадцатеричный код на два 32-битных слова (что должно быть безопасным в большинстве систем), вы сможете добиться большей точности. Например:

$f = bcadd(bcmul(hexdec(substr($h, 0, -8)), 0x100000000), hexdec(substr($h, 8)));

... установит для $ f значение 15406319846273791563.

3
ответ дан 3 December 2019 в 01:33
поделиться

Разве intval (var, base) не позаботится об этом?

Из руководства PHP .

-1
ответ дан 3 December 2019 в 01:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: