嗨我想分裂兩個整數ex:12/13但我總是得到一個整數1不是十進制數。如何在劃分兩個整數時獲得浮點值? (PHP)
我試着類型鑄造的價值浮動手之前沒有成功。
基本上所有我想要的是一個小數的結果,如:0.923 ...
$x = 12;
$y = 13;
echo $value = $x/$y; //Would like to see 0.923 not 1
嗨我想分裂兩個整數ex:12/13但我總是得到一個整數1不是十進制數。如何在劃分兩個整數時獲得浮點值? (PHP)
我試着類型鑄造的價值浮動手之前沒有成功。
基本上所有我想要的是一個小數的結果,如:0.923 ...
$x = 12;
$y = 13;
echo $value = $x/$y; //Would like to see 0.923 not 1
在正常情況下你的代碼應該返回浮點值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
不,精度爲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
只需使用$值=(浮動)($ X/$ Y); //結果將浮動。
乾杯!
- OP提到嘗試類型轉換。 –
echo $value = $x/(float) $y;
,如果你投的變量$y
作爲浮動解釋使用浮點除法,而不是整數除法。
因爲它是默認的假設使用整數除法在兩個整數變量。
這是不同的,如果你使用$y = 13.0
(浮點型變量作爲分母): 結果總是一個浮點數
請解釋您的答案如何解決問題,以便未來的訪問者可以從這個問題中受益。 – War10ck
所有其他的答案是不正確的,因爲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;
...
我得到'0.92307692307692'當我運行這個 –
檢查你的php.ini強制性的浮點十進制數或準確性,就像那個不記得它叫什麼。 – Dave
您運行的是哪個版本的PHP? 'php -v'或'phpinfo();' –