как преобразовать 9,0E-6 в 0.000009

petrovitch

Новичок
как преобразовать 9,0E-6 в 0.000009

Здравствуйте, всем, кто это читает!
Подскажите, пожалуйста, как преобразовать число 1,8E-5 в 0.000018, из массива извлекаются значения вида 0.000001, 0.000017 и т.д., до суммирования они именно так и выглядят, после того как я их суммирую - результат выглядит как 1,8E-5 и т.д., если каждое число описать в виде (preg_match("/^[1][\,][8][E][\-][5]$/","$summ")), то я могу, исходя из того, что опишу вывести результат, но только для каждого конкретного числа, результаты от 1 до 100 и описывать придется каждый. Из этих дробей нужны только две последние цифры и если их получить так $a=$summ{6};, $b=$summ{7};, то не понадобится для каждого результата от одного до ста писать описание, с числом вида 1,8E-5 так не получается.
$b=$summ{1};
echo $b;
выводит 1,8E-5{1}. В Google не нашел, в форумах ничего похожего тоже нет, возможно не смог правильно сформулировать запрос.
Спасибо за внимание!
 

phprus

Moderator
Команда форума
petrovitch
Из этих дробей нужны только две последние цифры
Расскажи подробнее что значит две последние цифры?
А если у тебя в результате суммирования получится число, которое точно не представимо в двоичном вещественном виде, то какие две последние цифры ты будешь брать? К примеру нельзя точно представить дробь 1/5. Посмотри на результат выполнения кода:
PHP:
echo number_format(1/5, 40);
, поизменяй точность отображения (второй параметр) и, возможно, ты будешь удивлен.
 

petrovitch

Новичок
sprintf оказалось тем, что мне было нужно, большое спасибо!

Я получил тот результат, которого добивался, но все же интересно, почему
echo number_format(0.000001+0.000018,40);
выводит 0.0000190000000000000044341700450312160342, ведь со школы я знаю, что 0.000001+0.000018 = 0.000019?
А echo number_format(1+18,40); выведет 19 и 40 нулей после запятой, если задать другую точность, будет больше нулей, но никаких цифр кроме нулей не будет?
 

Beavis

Banned
вот ещё код для размышления=)
PHP:
$a = 1.1 - 1;
$b = 0.1;
echo ($a == $b) ? "равны" : "не равны";
 

Beavis

Banned
petrovitch
почитай про то как хранятся числа с плавающей запятой в компьютере, и попробуй например представить 0.1 в двоичном виде.. а потом опять перевести в десятичный.

вот ещё примерчик =)))
PHP:
echo 309.78 * 100 % 100; // 78? нифига =)
 

petrovitch

Новичок
есть ли способ использовать числа с плавающей запятой, чтобы к примеру 0.000001+0.000003 было строго равно 0.000004?
 

petrovitch

Новичок
там рекомендуют пользоваться BC Math Functions http://www.php.net/manual/en/ref.bc.php я попробовал, получил сообщение
Fatal error: Call to undefined function bcscale(), после этого задал свой вопрос на форуме
 

Beavis

Banned
Автор оригинала: petrovitch
там рекомендуют пользоваться BC Math Functions http://www.php.net/manual/en/ref.bc.php я попробовал, получил сообщение
Fatal error: Call to undefined function bcscale(), после этого задал свой вопрос на форуме
Конечно undefined... Его устанавливать надо. Причем в мануале про это написано. Не надо сразу как что-то не получается, спрашивать на форуме, особенно если решение написано прям рядом.
 

petrovitch

Новичок
обычно и не спрашиваю, хватает мануала,google, faq и т.д., я не был уверен, что BC Math Functions - именно то что мне нужно, и спасибо всем, кто ответил советом, мне они и не понадобились

-~{}~ 08.01.09 14:19:

предлагаю закрыть тему, всем большое спасибо!
 

phprus

Moderator
Команда форума
petrovitch
Описание ситуации, которая тебя все-таки удивила: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374

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

petrovitch

Новичок
нужны цифры в интервале 0.000001 - 0.000100, и в них 5-я и 6-я цифры после запятой. Я их посмотрел все:
$i=0;
while ($i < 0.000100)
{
$i = sprintf("%f", $i);
$i = str_replace(",",".", $i);
$i = number_format($i,40);
echo "$i<br>";
$i=$i+0.000001;
}
все они при округлении будут теми, что мне нужны, если бы точность нужна была больше, пришлось бы придумывать что нибудь другое, а т.к. ограничен во времени, использую то, что есть
 

dimagolov

Новичок
petrovitch
раз тебе нужны числа в интервале 0.000001 - 0.000100 то храни их как целые от 1 до 100 и не майся дурью.
 
Сверху