Как избежать округления?

mike

pmcoder
Как избежать округления?

PHP:
echo sprintf("%01.3f", 0.00990099009901);
выдает 0,010.

Что можно сделать, чтобы результат был
0,009
 

mike

pmcoder
Tor
Мне не надо округлять, совсем наоборот
Я почему-то думал, что имею дело в форматированым выводом. Если не секрет при чем здесь арифметика?
echo sprintf("%01.3f", 0.009);
выдает то что нужно.
echo round(0.00990099009901,3);
тоже выдает 0,010
 

ksnk

прохожий
И все - таки арифметика :)
PHP:
$dig=3 ; // 3 digit after point
$num=0.00990099009901; 
echo sprintf("%01.".$dig."f", 0.00990099009901 -(5/pow(10,1+$dig)));
-~{}~ 08.09.05 18:51:

Он делает round сам... :(
 

ksnk

прохожий
Мутник
Кстати, тоже вариант, но, тогда уж preg_replace :)
 

mike

pmcoder
Спасибо за внимание. Вариант, который привел ForJest
мне больше всего понравился.
 

Фанат

oncle terrible
Команда форума
а вариант, которой привёл Мутник, в два раза проще.
но поскольку он не привёл готовый код, а только название функции, и надо самому лезть в ман, читать и писать, то, конечно же, больше подошёл вариант ForJest
кто бы сомневался.
 

mike

pmcoder
Фанат
Чем проще регулярные выражения за 3 арифметические операции?
PHP:
function digit($value,$dig){
  return  (int)($value*pow(10,$dig))/pow(10,$dig);
}

function digit($value,$dig){
  return preg_replace("/(\d+)(\.)([\d]{".$dig."})(\d+)/","$1$2$3",$value);
}
Я все таки думаю, что в данном контексте лучше использовать первый вариант. Кроме того время выполнения первого варианта как минимум на порядок меньше второго.
 

Фанат

oncle terrible
Команда форума
при чём здесь регулярные выражения?
если целая часть может быть любой, то да, математикой бысрее.
если же исходить из условий задачи, как она была поставлена, то строками быстрее
 

mike

pmcoder
Фанат, извини не не туда посмотрел
при чём здесь регулярные выражения?
Но все равно вариант со строкой работает тоже на порядок медленней, чем математика.
PHP:
function digit($value,$dig){
  return substr($value,0,$dig+2);
}
Но в любом случае спасибо за проявленное внимание.
 
Сверху