Как получить значение float при делении двух целых чисел? (РНР)
Привет я пытаюсь разделить два целых числа ex: 12/13, но я всегда получаю целое число 1 не десятичное число.
Я попытался ввести литье значений, чтобы плавать перед рукой без успеха.
в основном все, что я хочу, это десятичный результат, такой как: 0.923...
$x = 12;
$y = 13;
echo $value = $x / $y; //Would like to see 0.923 not 1
4 ответов
при нормальных обстоятельствах, ваш код должен возвращать значение с плавающей запятой 0.923076
...
причина, по которой вы получаете округленное целое число, может быть в том, что у вас есть ini setting
на "precision"
значение 0
, чтобы исправить это либо редактировать ваш php.ini
или использовать ini_set("precision", 3);
в вашем коде перед вычислением.
другой способ обойти это, чтобы использовать BCmath:
echo $value=bcdiv($a, $b, 3);
и еще один способ без использования какого-либо расширения-использовать маленький математический трюк, умножая значение, которое вы хотите разделить на 1000
и 3 decimals
.
Таким образом, вы разделите 12000
by 13
и вся часть будет 923
, затем, поскольку вы умножили на 1e3, вставьте запятую / точку перед последними тремя местами.
function divideFloat($a, $b, $precision=3) {
$a*=pow(10, $precision);
$result=(int)($a / $b);
if (strlen($result)==$precision) return '0.' . $result;
else return preg_replace('/(\d{' . $precision . '})$/', '.', $result);
}
echo divideFloat($a, $b); // 0.923
echo $value = $x / (float) $y;
Если вы бросаете переменную $y
в качестве float интерпретатор использует деление с плавающей запятой вместо целочисленного деления.
потому что по умолчанию используется целочисленное деление на две целочисленные переменные.
Это было по-другому, если вы использовали $y = 13.0
(плавающая переменная в качестве знаменателя):
Результатом всегда является число float
все остальные ответы неверны, потому что разделение PHP всегда будет возвращать значения float, как четко указано в официальном руководстве PHP: арифметические операторы , за исключением случаев, когда два операнда являются целыми числами, которые могут быть равномерно распределены.
на самом деле, вопрос неправильный: код должен производить 0.923... как и ожидалось от вопрошающего.
саркастически, проголосовавший ответ (пришел от @BulletProof47) является единственным другим, который просто не неправильно (но и бессмысленно). Кто знает, о чем он думал, но держу пари, все знают, почему он был отклонен :D
в случае, если кто заинтересован, базовая функция, которая делает разделение в php, является div_function
, расположенном в Zend/zend_operators.c
, как показано ниже:
ZEND_API int div_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) /* {{{ */
{
zval op1_copy, op2_copy;
int converted = 0;
while (1) {
switch (TYPE_PAIR(Z_TYPE_P(op1), Z_TYPE_P(op2))) {
case TYPE_PAIR(IS_LONG, IS_LONG):
if (Z_LVAL_P(op2) == 0) {
zend_error(E_WARNING, "Division by zero");
ZVAL_BOOL(result, 0);
return FAILURE; /* division by zero */
} else if (Z_LVAL_P(op2) == -1 && Z_LVAL_P(op1) == LONG_MIN) {
/* Prevent overflow error/crash */
ZVAL_DOUBLE(result, (double) LONG_MIN / -1);
return SUCCESS;
}
if (Z_LVAL_P(op1) % Z_LVAL_P(op2) == 0) { /* integer */
ZVAL_LONG(result, Z_LVAL_P(op1) / Z_LVAL_P(op2));
} else {
ZVAL_DOUBLE(result, ((double) Z_LVAL_P(op1)) / Z_LVAL_P(op2));
}
return SUCCESS;
...