2016-09-27 2 views
0

Я наткнулся на PHP округления десятичных значений с помощью:
круглых() функции округляет число с плавающей точкой.
Чтобы округлить число UP до ближайшего целого числа, посмотрите на ceil() функция.
Чтобы округлить число DOWN до ближайшего целого числа, посмотрите на floor() функция.округлить десятичные значения, чтобы точное целое значение PHP

У меня есть пример разделения 1000/13, который, когда мы используем
раунд (1000/13, 2) даст вам 999.98, а затем я буду использовать CEIL округлить его до 1000.
сейчас , мое значение равно 925.6, которое нужно разделить на 11, и я попытался с
раунд (925.6/11, 2), который даст 84.15, тогда если и умножить это на 11 (84.15 * 11), то вы получите 925,56. Теперь, как можно добиться точного десятичного числа, если какой-либо десятичный вход.

+0

Если вы уже округлили его в первую очередь, вы не можете ожидать получить тот же результат после умножения. Это основная математика. Не уверен, что именно вы делаете. –

+0

im, сделав это для ежемесячных сгенерированных векселей, вы бы знали, что десятичные значения играют роль в платежных транзакциях. – learner

ответ

1

округление двойную или Float с помощью round(), ceil() или floor() все имеют одну общую черту, и это: с их помощью вы подписавшись потерять точность данных. Это означает; после того, как штамп будет отлит, вы не сможете получить исходное значение снова .... это так просто:

Если вы хотите сохранить как усеченные, так и оригинальные значения, вам нужно сделать это по-другому ... Вам может потребоваться сохранить 2 переменные или просто поместить переменные в массив. Простой пример будет продемонстрировать это еще лучше:

<?php 

     $num  = (925.6/11); 

     // STORE THE ORIGINAL & ROUNDED VALUES IN AN ARRAY (IN CASE YOU NEED BOTH) 
     $arrNumbers = [ 
       'original' => $num, 
       'rounded' => round($num, 2), 
     ]; 

     // NOW; FOR YOUR MULTIPLICATIONS: 
     $original = $arrNumbers['original'] * 11; 
     $broken  = $arrNumbers['rounded'] * 11; 


     var_dump($original); //<== float 925.6 
     var_dump($broken);  //<== float 925.65 :: ADDED AN EXTRA 0.05 (BOGUS, HUH?) 
     var_dump($arrNumbers); //<== array (size=2) 'original' => float 84.1454545455 'rounded' => float 84.15 

ОБНОВЛЕНИЕ: ЧИСЛИТЕЛЬ как значение от формы поля.

 <?php 

     // ASSUME THE VALUE OF THE NUMERATOR IS: 925.6 
     $numerator  = htmlspecialchars(trim($_POST['some_field'])); 

     // AND THE DENOMINATOR IS NOW SOMETHING LIKE MONTH 11 AS IN: 11.0000 
     $denominator = 11.0000;           

     // NO PROBLEMS STILL... 
     $num   = ($numerator/$denominator); 

     // STORE THE ORIGINAL & ROUNDED VALUES IN AN ARRAY (IN CASE YOU NEED BOTH) 
     $arrNumbers  = [ 
       'original' => $num, 
       'rounded' => round($num, 2), 
     ]; 

     // NOW; FOR YOUR MULTIPLICATION, 
     // TO GET THE STARTING VALUES BACK DO: 
     $original  = $arrNumbers['original'] * 11; 
     $broken   = $arrNumbers['rounded'] * 11; 


     var_dump($original); //<== float 925.6 
     var_dump($broken);  //<== float 925.65 :: ADDED AN EXTRA 0.05 (BOGUS, HUH?) 
     var_dump($arrNumbers); //<== array (size=2) 'original' => float 84.1454545455 'rounded' => float 84.15 
+0

числитель исходит из формы, а знаменатель - нет. месяцев, чтобы он мог измениться на любые десятичные точки, так что это работает с таким типом. – learner

+0

@learner Конечно ... Обратитесь к недавно обновленной части Пост ... – Poiz

+0

это закругленное значение 84.15 должно идти в цикле for в соответствии с знаменателем $. поэтому вы можете положить их внутри цикла for. – learner

 Смежные вопросы

  • Нет связанных вопросов^_^