2013-06-20 69 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; 
    ...