Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Округление не округляется...
 
 автор: Shorr Kan   (05.01.2006 в 19:18)   письмо автору
 
 


<? 
$var 
=  23.23643
$var round($var,2); //  23.24 
?> 

Замечательно. А если мне надо в меньшую сторону?

<? 
$var 
=  23.23643
....
$var должно быть 23.23
?>

и

<? 
$var 
=  23.93643
....
$var должно быть 23.23
?>

   
 
 автор: Евгений Петров   (05.01.2006 в 19:37)   письмо автору
 
   для: Shorr Kan   (05.01.2006 в 19:18)
 

А скаких радостей 23.93643 округляется в 23.23

   
 
 автор: Shorr Kan   (05.01.2006 в 19:39)   письмо автору
 
   для: Евгений Петров   (05.01.2006 в 19:37)
 

Ну ошибся я, ошибся.... конечно - 23.93

   
 
 автор: Евгений Петров   (05.01.2006 в 19:42)   письмо автору
 
   для: Евгений Петров   (05.01.2006 в 19:37)
 

Если это была опечатка и имелось в виду 23.93 т.е. просто отбрасывать числа после 2-го знака, то можно регулярными выражениями вырезать
<?
  $val 
2.3456;
  
preg_match("/^([0-9]+\.[0-9]{2})/",$val,$regs);
  echo 
$regs[1];
?>

   
 
 автор: Shorr Kan   (05.01.2006 в 19:44)   письмо автору
 
   для: Евгений Петров   (05.01.2006 в 19:42)
 

Да, оно. Поклон.

   
 
 автор: midav   (05.01.2006 в 19:39)   письмо автору
 
   для: Shorr Kan   (05.01.2006 в 19:18)
 

Ну я в этом не спец, но разве не пишеться так $var=round($var,0,2);
или вместо 2 надо 4 в этом случае! Ну это мое мнение, никогда не проверял и не использовал еще функцию round

   
 
 автор: Shorr Kan   (05.01.2006 в 19:40)   письмо автору
 
   для: midav   (05.01.2006 в 19:39)
 

round() не переваривает три входящих параметра.

   
 
 автор: cheops   (05.01.2006 в 22:41)   письмо автору
 
   для: Shorr Kan   (05.01.2006 в 19:18)
 

В меньшую сторону следует использовать функцию floor(), как в теме по ссылке http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=5032
PS Правда он только до целых чисел работает. Разумнее наверное просто отрезать при помощи строковых функций до нужного знака после запятой.

   
 
 автор: Shorr Kan   (05.01.2006 в 23:40)   письмо автору
 
   для: cheops   (05.01.2006 в 22:41)
 

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

   
 
 автор: Евгений Петров   (06.01.2006 в 00:31)   письмо автору
 
   для: Shorr Kan   (05.01.2006 в 23:40)
 

-

   
 
 автор: Евгений Петров   (06.01.2006 в 00:31)   письмо автору
 
   для: Shorr Kan   (05.01.2006 в 23:40)
 

Строковыми функциями можно так:
<?
  $val 
23.34546;
  
$to = (($to strpos($val,".")) == null)?strlen($val):$to;
  echo 
substr($val,0,$to+3);
?>

   
 
 автор: Евгений Петров   (06.01.2006 в 00:37)   письмо автору
 
   для: Евгений Петров   (06.01.2006 в 00:31)
 

А только что придумал ещё как можно
<?
  $val 
23.3456789;
  echo 
round(($val-0.005),2);
?>

   
 
 автор: isset   (06.01.2006 в 00:38)   письмо автору
 
   для: Евгений Петров   (06.01.2006 в 00:31)
 

На всякий, чтобы не было проблем с разными локалями:

<?
  $val 
23.34546;
  
$to = (($to strpos($val,".") || ($to strpos($val,","))) == null)?strlen($val):$to;
  echo 
substr($val,0,$to+3);
?> 

   
 
 автор: Shorr Kan   (06.01.2006 в 01:18)   письмо автору
 
   для: isset   (06.01.2006 в 00:38)
 

Я не думал, что когда-нибудь скажу такое.... но не кажется ли вам, что регулярным тут попроще?...

а вариант

<?
$val = 23.3456789;
echo round(($val-0.005),2);
?>

кажется, округлит, а не обрежет.

   
 
 автор: cheops   (06.01.2006 в 01:20)   письмо автору
 
   для: Shorr Kan   (06.01.2006 в 01:18)
 

Зато строковыми функциями быстрее получится... хотя, конечно, не вооружённым взглядом это вряд ли можно заметить...

   
 
 автор: Евгений Петров   (06.01.2006 в 01:21)   письмо автору
 
   для: Shorr Kan   (06.01.2006 в 01:18)
 

Мне кажется проще и быстрее мой последний вариант, там где 0.05 вычитается

   
 
 автор: Shorr Kan   (06.01.2006 в 01:26)   письмо автору
 
   для: Евгений Петров   (06.01.2006 в 01:21)
 

вариант

<?
$val = 23.3456789;
echo round(($val-0.005),2);
?>

кажется, округлит, а не обрежет.
И почему -0.005 ?

   
 
 автор: Евгений Петров   (06.01.2006 в 01:32)   письмо автору
 
   для: Shorr Kan   (06.01.2006 в 01:26)
 

Количество нулей после запятой, это количество знаков которое надо обрезать. И он не округлит а именно обрежет. Например нам надо получить число 23.34:
минимальное число 23.3400000
максимальное число 23.3499999

теперь вычитаем:
из первого: 23.34-0.005 = 23.335 округляем = 23.34
из второго: 23.34999-0.005 = 23.34499 округляем = 23.34
таким образом числа как бы обрезаются

   
 
 автор: Shorr Kan   (06.01.2006 в 01:35)   письмо автору
 
   для: Евгений Петров   (06.01.2006 в 01:32)
 

23.35002-0.005 = 23.34997 округляем = 23.34 ... а должно быть 23.35

   
 
 автор: Евгений Петров   (06.01.2006 в 01:38)   письмо автору
 
   для: Shorr Kan   (06.01.2006 в 01:35)
 

23.35002-0.005 = 23.34502 округляем = 23.35

вы скрипт запустите и сами во всем убедитесь

   
 
 автор: Евгений Петров   (06.01.2006 в 01:40)   письмо автору
 
   для: Shorr Kan   (06.01.2006 в 01:35)
 

И кстати если округлить 23.34997 то будет не 23.34 а 23.35 :))))

   
 
 автор: Shorr Kan   (06.01.2006 в 01:56)   письмо автору
 
   для: Евгений Петров   (06.01.2006 в 01:40)
 

Ничего не понял, ладно - практика мне объяснит. К сожалению, сейчас ничего проверить не могу, но к утру - буду более эрудирован. Спасибо.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования