ExBB Community » » PHP/Perl » PHP, числа большой точности

Страниц (1): [1]
 

1. KaRaL - 19 октября 2010 — 16:41 - перейти к сообщению
В php при сложении переменной (например $a=3) с 17- значным (например $b=12345678901234567) числом получается результат 1.2345678901E+16.
Как сделать чтоб выводилось простое число, а не 1.2345678901E+16.
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;
?>

вместо ожидаемого результата 12345678901234570 напечатает 12345678901234572. Двойка в конце как раз и вызвана переполнением. К сожалению, работа с более широкой мантиссой в PHP не предусмотрена. Однако в PHP есть функции, позволяющие осуществлять арифметические операции над числами произвольной точности, представленными в виде строк. В Вашем случае рекомендую пользоваться именно ими. Одна из таких функций - функция сложения bcadd(). Вот пример её использования:
CODE:
<?php
$a = '3';
$b = '12345678901234567';
$c = bcadd($a, $b);
echo $c;
?>

Данный пример напечатает верный результат - 12345678901234570. Обратите внимание на то, что значения переменных-слагаемых $a и $b заключены в кавычки. Это необходимо для того, чтобы PHP присваивал им значения-строки, а не числа. В базе данных (или в файле при хранении данных методом сериализации) необходимо также сохранять эти значения как строки. Иначе может возникнуть всё та же проблема с переполнением мантиссы числа, что и в первом случае

Яндекс.Метрика   

Powered by ExBB
[Script Execution time: 0.0162]     [ ]