# 解决PHP的bcmul函数计算结果不对的问题

**URL:** <https://www.shiqidu.com/t/topic/422>\
**Category:** 开发调优\
**Tags:** PHP\
**Created:** [2018 年5 月 11 日 07:03 UTC](https://www.shiqidu.com/t/topic/422 "2018-05-11T07:03:21Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

作者： ![yeqiu](https://www.shiqidu.com/user_avatar/www.shiqidu.com/yeqiu/32/14_2.png) [@yeqiu](https://www.shiqidu.com/u/yeqiu)\
发布日期： [2018 年5 月 11 日 07:03 UTC](https://www.shiqidu.com/t/topic/422/1 "2018-05-11T07:03:21Z")

</div>

计算100万分之1乘以100万，使用`bcmul`函数。

```php
var_dump(bcmul(0.000001, 1000000));

```

很简单的计算，结果应该是1，但是程序运行之后发现结果并不是1，而是 **0** ；

如果想得到正确的结果你可能需要这样处理一下。

```php
var_dump(bcmul(sprintf('%.6f', 0.000001), 1000000));

```

先把浮点数格式化为带6位小数的字符串类型，然后才能得到正确的结果。

### 为什么呢？

通过官方文档你会发现`bcmul`要的是两个字符串类型的参数。

![bcmul](https://discourse.shiqidu.com/upload/discussion/20180511/d67b3c97aeb7048feba1ce0a2717bf5c_origin.png)

于是尝试把浮点型转为string类型。

```php
var_dump(bcmul((string)0.000001, (string)1000000));

```

但是你发现这并没有什么luan用，结果还是0。

### 最后

通过`var_dump((string)0.000001);`你会发现得到的结果并不是 **‘0.000001’** ，而是 **‘1.0E-6’** 。

也许问题就出现在这里，所以需要用`sprintf`函数先把浮点型的`1.000000`转换为字符串的`'1.000000'`，然后就能得到请正确的结果了。

---

<div class="post-metadata">

作者： ![Leon](https://www.shiqidu.com/user_avatar/www.shiqidu.com/leon/32/5_2.png) [@Leon](https://www.shiqidu.com/u/Leon)\
发布日期： [2018 年5 月 11 日 07:50 UTC](https://www.shiqidu.com/t/topic/422/2 "2018-05-11T07:50:34Z")

</div>

直接加个单引号就行了吧？

---

<div class="post-metadata">

作者： ![zysafe](https://www.shiqidu.com/letter_avatar_proxy/v4/letter/z/848f3c/32.png) [@zysafe](https://www.shiqidu.com/u/zysafe)\
发布日期： [2019 年12 月 4 日 10:57 UTC](https://www.shiqidu.com/t/topic/422/3 "2019-12-04T10:57:39Z")

</div>

主要考虑变量传入的情况呀

---

<div class="post-metadata">

作者： ![Leon](https://www.shiqidu.com/user_avatar/www.shiqidu.com/leon/32/5_2.png) [@Leon](https://www.shiqidu.com/u/Leon)\
发布日期： [2019 年12 月 4 日 11:05 UTC](https://www.shiqidu.com/t/topic/422/4 "2019-12-04T11:05:59Z")

</div>

可以用 strval 把传进来的变量转成字符串
