php bcmul结果为0,php – 为什么bcmul返回的数字与我指定的数字不同?

PHP的BCMath函数bcmul中存在一个错误.从PHP 5.5.7开始,它仍然存在,这是撰写本文时的最新稳定版本.

如果你是browse the source code(PHP 5.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;

}

注意:“scale”一词是指分隔符后面的位数.

看一下分配prod_scale的行.当您调用bcmul(“0.3”,“0.2”,4)时,遍历代码,我们看到:prod_scale = MIN(2,MAX(4,MAX(1,1)));,因此prod_scale被赋值2.

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

我已将此问题和补丁提交给PHP错误跟踪系统(#66364).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值