我相信很多人都经历过,我在 float 学方面遇到了一个小问题 - 我在 JavaScript 中解决了这个问题,但是虽然似乎在 PHP 中可以,我想确保它可以依赖,因为它与 JS 版本略有不同。
JavaScript:
var item = 25.00;
var postage = 24.99;
((item + postage) * 100) // 4998.999999999999
显然我不想要这个,我想要 49.99
,所以我将其更改为:
((item + postage) * 100).toFixed(0) // 4999 (string)
然后为了更好的措施,我将其更改为:
provideFloat((book_price + shipping_cost) * 100).toFixed(0)) // 4999 (float)
function provideFloat(num) {
return parseFloat(num.replace(/,/g, ''));
}
现在,我需要在 PHP 端测试这个数字,看看它们是否匹配,所以我尝试了这个(例如):
PHP:
$item = 25.00;
$postage = 24.99;
echo ((item + $postage) * 100); // 4999
正如您所看到的,与 JavaScript 的结果不同 - 我可以相信这是“正确的”进行比较,而不是最终得到类似 4998.999999999999
的结果吗?
出于兴趣,我尝试应用与 JavaScript 类似的技术 similar approach JS 在其 toFixed
函数中使用,其中:
$number = (($item + $postage) * 100);
$expo = pow(10,0);
$number = intval($number * $expo) / $expo;
echo $number; // 4998
...我得到 4998
而 JS 得到 4999
- 那么我应该坚持实际得到 4999
结果吗?这可以依靠吗?
..或者你必须像这样走极端吗?
$res = (($item + $postage) * 100);
$res = (float) number_format($res, 0, '.','');
echo $res; // 4999
我的用例是我需要将 float (美元)转换为美分,然后从客户端到服务器端进行比较。
最佳答案
简单回答:不。您不能依赖 PHP 或任何语言中的浮点精度。虽然它可能适用于此示例,但在某些情况下它会不匹配。
如果需要精度,请使用整数进行数学计算或将 bcadd() 与字符串一起使用。
如果足够接近就可以了,你应该能够摆脱 round() 的困扰。 number_format() 不适用于比较,仅用于格式化(请参阅千位分隔符)。
关于javascript - JavaScript 和 PHP 中的 float 加法及其一致性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082330/