javascript - JavaScript 和 PHP 中的 float 加法及其一致性

标签 javascript php floating-point floating-accuracy

我相信很多人都经历过,我在 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/

相关文章:

php - 带有 % 百分比操作的嵌套 count() 函数

php - Laravel 5.1 本地化工厂播种机

floating-point - 大于 1 的最小反/标准化数是多少?(64 位)

java - 将浮点转换为字符串

javascript - 从浏览器录制视频并流式传输到 Youtube/Twitch 时,如何使用 ffmpeg 添加音频?

javascript - 我可以在文档上使用什么来不时应用一个功能,包括 future 的元素?

php - 运行 soapclient 时出现内部服务器错误

javascript - 在 Polymer 中获取元素内容而不显示在页面上

javascript - ReactJS - 如何更新嵌套和 "normal"状态属性?

php - 如何删除 float 小数部分末尾的零?