嗨,我正在尝试将两个整数相除:12/13,但我总是得到一个整数 1 而不是十进制数。
我尝试将值强制转换为浮动,但没有成功。
基本上我想要的只是一个十进制结果,例如:0.923 ...
$x = 12;
$y = 13;
echo $value = $x / $y; //Would like to see 0.923 not 1
在正常情况下,您的代码应该返回浮点值0.923076
...
您获得四舍五入整数的原因可能是因为您将ini setting
for"precision"
设置为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: 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;
...
只需使用 $value = (float)($x/$y); //结果将浮动。
干杯!