代码之家  ›  专栏  ›  技术社区  ›  Brett

JavaScript和PHP中的浮点数加法及其一致性

  •  0
  • Brett  · 技术社区  · 6 年前

    JavaScript语言 然而,当它

    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端的这个数字是为了看它们是否匹配,所以我尝试了这个(例如):

    菲律宾比索:

    $item = 25.00;
    $postage = 24.99;
    
    echo ((item + $postage) * 100); // 4999
    

    4998.999999999999 ?

    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
    

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Devon Bessemer    6 年前

    简单的回答是:不可以。在PHP或任何语言中都不能依赖浮点精度。虽然它可能适用于此示例,但在某些情况下它将不匹配。