Отбрасывание десятичных знаков PHP без округления

Я хочу сбросить десятичные знаки без округления. Например, если у меня есть 1.505, я хочу отбросить последнее десятичное число, а значение должно быть 1.50. Есть ли такая функция в PHP?

Вам нужно слово () следующим образом:

$rounded = floor($float*100)/100; 

Или вы отбрасываете целое число:

 $rounded = 0.01 * (int)($float*100); 

Таким образом, это не будет округлять.

 $float = 1.505; echo sprintf("%.2f", $float); //outputs 1.50 

Может быть, уже слишком поздно, но вот хороший подход:

  $getTruncatedValue = function( $value, $precision ) { //Casts provided value $value = ( string )$value; //Gets pattern matches preg_match( "/(-+)?\d+(\.\d{1,".$precision."})?/" , $value, $matches ); //Returns the full pattern match return $matches[0]; }; var_dump ( $getTruncatedValue(1.123,1), //string(3) "1.1" $getTruncatedValue(1.345,2), //string(4) "1.34" $getTruncatedValue(1.678,3), //string(5) "1.678" $getTruncatedValue(1.90123,4) //string(6) "1.9012" ); 
  • Единственной ошибкой в ​​этом подходе может быть необходимость использования регулярного выражения (которое иногда может привести к снижению производительности).

Примечание. Трудно найти собственный подход к усечению десятичных знаков, и я думаю, что это невозможно выполнить с помощью sprintf и других связанных с строкой функций.

Чтобы сделать это точно для чисел + ve и -ve, вам необходимо использовать:
– функция php floor() для чисел + ve
– функция php ceil() для чисел -ve

 function truncate_float($number, $decimals) { $power = pow(10, $decimals); if($number > 0){ return floor($number * $power) / $power; } else { return ceil($number * $power) / $power; } } 

причина этого в том, что floor() всегда округляет число вниз , а не к нулю.
т.е. floor() эффективно округляет числа до большей абсолютной величины
например, floor(1.5) = 1 а floor(-1.5) = -2

Поэтому, для multiply by power, remove decimals, divide by power методу усечения multiply by power, remove decimals, divide by power :
floor() работает только для положительных чисел
ceil() работает только для отрицательных чисел

Чтобы проверить это, скопируйте следующий код в редактор http://phpfiddle.org/lite (или аналогичный):

 <div>Php Truncate Function</div> <br> <?php function truncate_float($number, $places) { $power = pow(10, $places); if($number > 0){ return floor($number * $power) / $power; } else { return ceil($number * $power) / $power; } } // demo $lat = 52.4884; $lng = -1.88651; $lat_tr = truncate_float($lat, 3); $lng_tr = truncate_float($lng, 3); echo 'lat = ' . $lat . '<br>'; echo 'lat truncated = ' . $lat_tr . '<br>'; echo 'lat = ' . $lng . '<br>'; echo 'lat truncated = ' . $lng_tr . '<br><br>'; // demo of floor() on negatives echo 'floor (1.5) = ' . floor(1.5) . '<br>'; echo 'floor (-1.5) = ' . floor(-1.5) . '<br>'; ?> 

вы можете преобразовать тип данных 1.505 в String и использовать substring() для усечения последнего символа.
И снова преобразуйте его в integer .

Используйте встроенную функцию PHP bcdiv .

Пример:

 echo bcdiv(3.22871, 1, 1); // 3.2 echo bcdiv(3.22871, 1, 2); // 3.22 echo bcdiv(3.22871, 1, 3); // 3.228 echo bcdiv(-3.22871, 1, 1); // -3.2 echo bcdiv(-3.22871, 1, 2); // -3.22 

просто do (int) $number; получить целое число

Я знаю, что это поздний ответ, но вот простое решение. Используя пример OP 1.505, вы можете просто использовать следующее, чтобы добраться до 1.50.

 function truncateExtraDecimals($val, $precision) { $pow = pow(10, $precision); $precise = (int)($val * $pow); return (float)($precise / $pow); } 

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

 $val = 1.509; $truncated = sprintf('%.2f', truncateExtraDecimals($val, 2)); echo "Result: {$truncated}"; Result: 1.50 

Спринтf необходим, чтобы получить ровно 2 десятичных знака для отображения, иначе результат был бы 1,5 вместо 1.50.

Мы можем использовать функции bc, если они доступны:

 echo bcadd(sprintf('%F', 5.445), '0', 2); // => 5.44 echo sprintf('%.2F', 5.445); // => 5.45 
 $num = 118.74999669307; $cut = substr($num, 0, ((strpos($num, '.')+1)+2));` // Cut the string from first character to a length of 2 past the decimal. / substr(cut what, start, ( (find position of decimal)+decimal itself)+spaces after decimal) ) echo $cut; 

это поможет вам сократить значение поплавка, не округляя его.