Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 数学运算后的mongoDB奇怪结果_Php_Mongodb_Yii_E Commerce_Addition - Fatal编程技术网

Php 数学运算后的mongoDB奇怪结果

Php 数学运算后的mongoDB奇怪结果,php,mongodb,yii,e-commerce,addition,Php,Mongodb,Yii,E Commerce,Addition,我有一个带有数字产品的电子商务网站(没有库存,只有报告功能) 有时我会在客户账户余额方面得到奇怪的结果: e、 g.客户余额为30英镑,在以29.95英镑购买了一款产品后,我在管理面板中看到他的余额为0.05000000000001而不是0.05 或者有时我看到的是520.949999999,而不是520.95 为什么会这样 该网站在PHP上运行,并与mongo进行交互,但对于任何类型的货币数学来说,使用double或float都是不可取的,因为精确的计算至关重要。对这个问题进行了详细的讨论。更

我有一个带有数字产品的电子商务网站(没有库存,只有报告功能)

有时我会在客户账户余额方面得到奇怪的结果:

e、 g.客户余额为30英镑,在以29.95英镑购买了一款产品后,我在管理面板中看到他的余额为
0.05000000000001
而不是
0.05

或者有时我看到的是
520.949999999
,而不是
520.95

为什么会这样


该网站在PHP上运行,并与mongo进行交互,但对于任何类型的货币数学来说,使用double或float都是不可取的,因为精确的计算至关重要。对这个问题进行了详细的讨论。更好的替代方法是使用整数跟踪这些值,其中
1
是最小的货币单位(在本例中为美分),并从那里开始工作

根据您对浮点的计算方式(保存精确值、减法结果或使用运算符),您可能会得到混合结果:

> db.foo.insert({ _id: 'value', x: 0.05 })
> db.foo.insert({ _id: 'subtraction', x: 30 - 29.95 })
> db.foo.insert({ _id: 'decrement',  x: 30 })
> db.foo.update({ _id: 'decrement' }, { $inc: { x: -29.95 }})
> db.foo.find()
{ "_id" : "value", "x" : 0.05 }
{ "_id" : "subtraction", "x" : 0.05000000000000071 }
{ "_id" : "decrement", "x" : 0.05000000000000071 }

如果您设置了使用浮点并在PHP中进行数学运算(即在更新查询中不使用<代码> $Inc<代码>),请考虑使用SET精度使用,这将产生与上述第一个示例类似的结果。number_format()可以显示,但在更新文档时请注意不要使用它,因为它会返回字符串。

可能与否有关吗?如果他没有使用JS插入,那么这是不相关的,您是否在重新保存数字之前格式化数字?如果不是,那实际上就是原因;你需要告诉PHP你想如何保存它们。我把yii和yui搞混了。@Sammaye我只是做了一些像
$userCollection->balance-=29.95$用户集合->保存()
。这应该很管用。但事实并非如此。是的,PHP可以根据需要更改精度,使用
number\u格式