Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么bcmul返回的数字的刻度与我指定的刻度不同?_Php_Bcmath - Fatal编程技术网

Php 为什么bcmul返回的数字的刻度与我指定的刻度不同?

Php 为什么bcmul返回的数字的刻度与我指定的刻度不同?,php,bcmath,Php,Bcmath,在php.net文档中,我似乎找不到解释以下结果的任何内容: $ php -r 'var_dump(bcsub("0.3", "0.2", 4));' string(6) "0.1000" $ php -r 'var_dump(bcmul("0.3", "0.2", 4));' string(4) "0.06" 减法结果正是我所期望的(我指定了一个4位数的刻度,结果中给出了一个)。乘法结果不是(我指定了一个4位数的刻度,但它在结果中给了我一个2位数的刻度)。为什么不同 注意:我已经知道如何使用

在php.net文档中,我似乎找不到解释以下结果的任何内容:

$ php -r 'var_dump(bcsub("0.3", "0.2", 4));'
string(6) "0.1000"
$ php -r 'var_dump(bcmul("0.3", "0.2", 4));'
string(4) "0.06"
减法结果正是我所期望的(我指定了一个4位数的刻度,结果中给出了一个)。乘法结果不是(我指定了一个4位数的刻度,但它在结果中给了我一个2位数的刻度)。为什么不同

注意:我已经知道如何使用,我也知道数学上的
0.06==0.0600
。我只想了解为什么BC数学在结果的尺度上表现得不同


注意#2:如上所述,
number\u format()
不是此问题的答案,引用的“重复问题”中使用的答案都建议使用
number\u format()
。我很清楚这个函数可以用来将数字格式化到指定的精度。我只是好奇地想知道为什么这些函数的返回值有不同的尺度,而不是如何修复它们,使它们如此。

PHP的BCMath函数
bcmul
中有一个bug。它仍然存在于PHP5.5.7,这是本文撰写时最新的稳定版本

如果您使用(PHP5.5的BCMath recmul.c),您将看到相关函数:

void
bc_multiply (bc_num n1, bc_num n2, bc_num *prod, int scale TSRMLS_DC)
{
  bc_num pval; 
  int len1, len2;
  int full_scale, prod_scale;

  /* Initialize things. */
  len1 = n1->n_len + n1->n_scale;
  len2 = n2->n_len + n2->n_scale;
  full_scale = n1->n_scale + n2->n_scale;
  prod_scale = MIN(full_scale,MAX(scale,MAX(n1->n_scale,n2->n_scale)));

  /* Do the multiply */
  _bc_rec_mul (n1, len1, n2, len2, &pval, full_scale TSRMLS_CC);

  /* Assign to prod and clean up the number. */
  pval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS );
  pval->n_value = pval->n_ptr;
  pval->n_len = len2 + len1 + 1 - full_scale;
  pval->n_scale = prod_scale;
  _bc_rm_leading_zeros (pval);
  if (bc_is_zero (pval TSRMLS_CC))
    pval->n_sign = PLUS;
  bc_free_num (prod);
  *prod = pval;
}
注:“刻度”一词是指分隔符后的位数

查看分配了
prod\u scale
的行。当调用
bcmul(“0.3”、“0.2”、“4”)
遍历代码时,我们会看到:
prod_scale=MIN(2,MAX(4,MAX(1,1)),因此
prod_scale
被分配一个值
2

而且,正如预期的那样,该函数返回的值在小数点后是两位,而不是四位。与其他BCMath PHP函数不同(例如,请参见PHP5.5的BCMath第63-98行),在该函数的逻辑中,没有任何地方会附加尾随的零


我已经向PHP bug跟踪系统()提交了这个问题和一个补丁