添加JavaScript和PHP中的浮点数和一致性

问题描述 投票:0回答:1

我确信很多人都经历过,我对浮点数学有一点问题 - 我用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

我的用例是我需要将浮点数(美元)转换为美分,然后将它们从客户端到服务器端进行比较。

javascript php floating-point floating-accuracy
1个回答
1
投票

简单回答:不可以。您不能依赖PHP或任何语言的浮点精度。虽然它可能适用于此示例,但有时会出现不匹配的情况。

如果需要精度,可以使用整数进行数学运算,也可以将bcadd()与字符串一起使用。

如果足够接近是好的,你应该能够逃脱圆()。 number_format()不适用于比较,只需格式化(参见千位分隔符)。

© www.soinside.com 2019 - 2024. All rights reserved.