Как получить значение float при делении двух целых чисел? (PHP) - программирование
Подтвердить что ты не робот

Как получить значение float при делении двух целых чисел? (PHP)

Привет, я пытаюсь разделить два целых числа: 12/13, но я всегда получаю целое число 1, а не десятичное число.

Я попробовал тип, литье значения, чтобы плавать перед рукой без успеха.

В основном все, что я хочу, это десятичный результат: 0.923...

$x = 12;
$y = 13;
echo $value = $x / $y; //Would like to see 0.923 not 1
4b9b3361

Ответ 1

В нормальных условиях ваш код должен возвращать плавающее значение 0.923076...

Причина, по которой вы получаете округленное целое число, может быть связана с тем, что у вас есть ini setting для "precision" для 0, чтобы исправить это либо отредактировать php.ini, либо использовать ini_set("precision", 3); в вашем коде перед вычислением.

Другим способом решения этой проблемы является использование BCmath:

echo $value=bcdiv($a, $b, 3);

И еще один способ без использования какого-либо расширения - использовать небольшой математический трюк, умножив значение, которое вы хотите разделить на 1000, чтобы получить 3 decimals.
Таким образом вы разделите 12000 на 13, и вся часть будет 923, а затем, умножая на 1е3, вставьте запятую/точку перед последними наиболее 3-мя местами.

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 . '})$/', '.\1', $result);
}

echo divideFloat($a, $b); // 0.923

Ответ 2

echo $value = $x / (float) $y;

если вы передаете переменную $y как float, интерпретатор использует деление с плавающей запятой вместо целочисленного деления.

поскольку по умолчанию предлагается использовать целочисленное деление на две целые переменные.

Было другое, если вы использовали $y = 13.0 (переменную float как знаменатель): Результаты всегда представляют собой число с плавающей запятой

Ответ 3

Все остальные ответы НЕ ПРАВИЛЬНЫ, потому что разделение 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;
    ...

Ответ 4

Просто используйте $value = (float) ($ x/$y);//Результат будет в float.

Ура!