网站上的vr全景是怎么做的,东莞大型网站建设,百度问一问官网,网站icon图标怎么设置一、问题缘由
PHP 服务接收前端传过来的单价(字符串形式)和数量#xff0c;把单价转成分(单价*100)#xff0c;然后传给下游的 Golang 服务#xff0c;不过最后从两个服务日志中发现金额相差 1。
以下为前端传的
{amount: 4,price: 9.2把单价转成分(单价*100)然后传给下游的 Golang 服务不过最后从两个服务日志中发现金额相差 1。
以下为前端传的
{amount: 4,price: 9.2
}PHP 转换的
{amount: 4,price: 920
}下游服务接收到的
{amount: 4,price: 919
}问题跟踪
查看了下PHP 处理的代码
$price $req[price] * 100;乍一看木得毛病。但是使用 var_dump 打印就能看出问题来
$price $req[price] * 100;
var_dump($price); // float(920)看到没是 float 类型看了下 Golang 对应的结构体为
type req struct {price int64amount int64
}也就是在使用传递过程中会把 float 转成 int。由于浮点数在计算机中表示方式的精度问题$price 实际上可能是一个非常接近 920 的值如 919.99999999999但不是精确的 920导致转成 int 截断时结果为 919。
问题解决
既然 float 转 int 会截断那么可以先转成 string 再转成 int 就可以了
$price intval(strval($req[price] * 100));当然了也可以用 PHP 的 bcmath 高精度扩展来解决。
$price bcmul($price, 100, 0);
$price intval($price);