2013-06-20 67 views
14

嗨我想分裂两个整数ex:12/13但我总是得到一个整数1不是十进制数。如何在划分两个整数时获得浮点值? (PHP)

我试着类型铸造的价值浮动手之前没有成功。

基本上所有我想要的是一个小数的结果,如:0.923 ...

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

我得到'0.92307692307692'当我运行这个 –

+5

检查你的php.ini强制性的浮点十进制数或准确性,就像那个不记得它叫什么。 – Dave

+1

您运行的是哪个版本的PHP? 'php -v'或'phpinfo();' –

回答

8

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

你得到一个圆整数可能是因为你有你的ini setting"precision"设置为0,解决这个问题可以编辑原因,你php.ini或计算前在代码中使用ini_set("precision", 3);

另一种方式来解决此是使用BCmath:通过您想1000划分到值乘以

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

而另一种方式,而无需使用任何扩展使用一些数学技巧得到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

+1

不,精度为0,我们有'0.9'.http://www.php.net/manual/en/ini.core.php#ini.precision不够清楚;更长的解释:PHP使用他自己的((v)s)printf字符串解析实现。在格式字符串中使用模式'%H':它将参数'mode'设置为'2'调用函数'zend_dtoa',其中指示文档:'[mode] 2 ==> max(1,ndigits )有效数字。除了尾部零被抑制之外,这给出了与ecvt相似的返回值。(见:http://lxr.php.net/xref/PHP_TRUNK/Zend/zend_strtod.c#1457))这就是为什么'precision = 1'=='精度= 0'。 – bwoebi

-1

只需使用$值=(浮动)($ X/$ Y); //结果将浮动。

干杯!

+5

- OP提到尝试类型转换。 –

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

,如果你投的变量$y作为浮动解释使用浮点除法,而不是整数除法。

因为它是默认的假设使用整数除法在两个整数变量。

这是不同的,如果你使用$y = 13.0(浮点型变量作为分母): 结果总是一个浮点数

+1

请解释您的答案如何解决问题,以便未来的访问者可以从这个问题中受益。 – War10ck

2

所有其他的答案是不正确的,因为PHP的部门总是会返回浮点值,如规定清楚地在官方手册PHP: Arithmetic Operators中,除了两个操作数都是可以平分的整数的情况。

事实上,问题是错误的:代码应该产生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; 
    ...