除以两个整数时如何获得浮点值?(菲律宾比索)


How do I get a float value when dividing two integers? (PHP)

嗨,我正在尝试除以两个整数,例如:12/13,但我总是得到一个整数 1 而不是十进制数。

我尝试将值转换为浮动,但没有成功。

基本上我想要的只是一个十进制结果,例如:0.923...

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

在正常情况下,您的代码应返回浮点值0.923076...

您获得舍入整数的原因可能是因为您将"precision"ini setting设置为 0 ,要解决此问题,请在计算前编辑php.ini或在代码中使用ini_set("precision", 3);

解决此问题的另一种方法是使用 BCmath:

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

另一种不使用任何扩展名的方法是使用一些数学技巧,将您要除以的值乘以1000得到3 decimals
这样,您将12000除以13,整个部分将923,然后由于您乘以 1e3,请在最后最 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

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

如果将变量$y转换为浮点数,解释器将使用浮点除法而不是整数除法。

因为默认假设对两个整数变量使用整数除法。

如果您使用 $y = 13.0(浮点变量作为分母(,情况会有所不同:结果始终是一个浮点数

所有其他答案都是不正确的,因为 PHP 的除法将始终返回浮点值,正如官方手册 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;
    ...

只需使用 $value = (float(($x/$y(;//result 将以 float 形式显示。

干杯!