加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 为什么我从两个假设类似的算术运算中得到不同的结果?

发布时间:2020-12-13 14:13:01 所属栏目:PHP教程 来源:网络整理
导读:在下面的代码中,为什么乘法方法不会产生舍入误差,而累积加法方法是什么? function get_value() { return 26.82; }function a($quantity) { $value_excluding_vat = get_value(); $value_including_vat = round($value_excluding_vat * (1 + (20 / 100)),2);
在下面的代码中,为什么乘法方法不会产生舍入误差,而累积加法方法是什么?
function get_value() { return 26.82; }

function a($quantity) {
    $value_excluding_vat = get_value();
    $value_including_vat = round($value_excluding_vat * (1 + (20 / 100)),2);
    $total_nett = 0;
    $total_gross = 0;
    for($i=0; $i<$quantity; $i++) {
        $total_nett += $value_excluding_vat;
        $total_gross += $value_including_vat;
    }
    return array(
        $total_nett,$total_gross
    );
}

function b($quantity) {
    $value_excluding_vat = get_value();
    $value_including_vat = round($value_excluding_vat * (1 + (20 / 100)),2);
    return array(
        $quantity * $value_excluding_vat,$quantity * $value_including_vat
    );
}

$totals = a(1000);
print_r($totals);
echo $totals[1] - $totals[0];
echo "nn";
$totals = b(1000);
print_r($totals);
echo $totals[1] - $totals[0];

这是我的输出:

Array
(
    [0] => 26820
    [1] => 32180
)
5360.0000000005

Array
(
    [0] => 26820
    [1] => 32180
)
5360
首先,考虑在基数10中有许多数是合理的,但在二进制浮点表示中则不是.例如,浮点值26.82实际上是26.8200000000000002842170943040400743484497

自然地,如果你继续添加这个自己一些错误蠕变,但最多15个有效数字你应该没关系 – 添加这1000次,总和实际上是26819.9999999997671693563461303710937500000000

有趣的问题是,当我们多次26.82乘1000.0我们得到26820.0000000000000000000000000000000000000000 – 它是如何做到的?

答案就是26820.0确实有一个精确的二进制表示,并且乘法运算足够聪明,可以发现 – 甚至乘以1001.0并减去26.82仍然可以得到一个确切的答案.

这是一些有趣的链接

> http://www.h-schmidt.net/FloatConverter/ – 这使您可以查看浮点数的单精度表示,并且可以用于真正理解浮点数
>这个RFC on PHP rounding很有意思,因为它涵盖了围绕浮动的一些问题
>和What Every Computer Scientist Should Know About Floating-Point Arithmetic

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读