嗨我想分裂两个整数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();' –