В php при сложении переменной (например $a=3) с 17- значным (например $b=12345678901234567) числом получается результат 1.2345678901E+16.
Как сделать чтоб выводилось простое число, а не 1.2345678901E+16.
1. KaRaL - 19 октября 2010 — 16:41 - перейти к сообщению
2. yura3d - 20 октября 2010 — 04:08 - перейти к сообщению
KaRaL
Можно перед печатью преобразовать число в строку:
Можно перед печатью преобразовать число в строку:
CODE:
$c = (string)($a + $b);
3. KaRaL - 20 октября 2010 — 13:25 - перейти к сообщению
Спасибо
4. yura3d - 21 октября 2010 — 06:59 - перейти к сообщению
KaRaL пишет:
Спасибо
Возможен ещё вариант:
CODE:
$c = sprintf("%.0f", $a + $b);
В этом случае число будет приведено к нужной Вам форме, однако из-за переполнения мантиссы числа содержимое младших разрядов может быть неопределённым. Например, следующий фрагмент:
CODE:
<?php
$a = 3;
$b = 12345678901234567;
$c = sprintf("%.0f", $a + $b);
echo $c;
?>
$a = 3;
$b = 12345678901234567;
$c = sprintf("%.0f", $a + $b);
echo $c;
?>
вместо ожидаемого результата 12345678901234570 напечатает 12345678901234572. Двойка в конце как раз и вызвана переполнением. К сожалению, работа с более широкой мантиссой в PHP не предусмотрена. Однако в PHP есть функции, позволяющие осуществлять арифметические операции над числами произвольной точности, представленными в виде строк. В Вашем случае рекомендую пользоваться именно ими. Одна из таких функций - функция сложения bcadd(). Вот пример её использования:
CODE:
<?php
$a = '3';
$b = '12345678901234567';
$c = bcadd($a, $b);
echo $c;
?>
$a = '3';
$b = '12345678901234567';
$c = bcadd($a, $b);
echo $c;
?>
Данный пример напечатает верный результат - 12345678901234570. Обратите внимание на то, что значения переменных-слагаемых $a и $b заключены в кавычки. Это необходимо для того, чтобы PHP присваивал им значения-строки, а не числа. В базе данных (или в файле при хранении данных методом сериализации) необходимо также сохранять эти значения как строки. Иначе может возникнуть всё та же проблема с переполнением мантиссы числа, что и в первом случае