Javascript,舍入和计算原始值的值

时间:2017-03-19 11:08:16

标签: javascript jquery rounding rounding-error

我正在尝试计算一系列应该与原始值汇总的值。

Example

如果查看上面的示例,您可以看到汇总成本和计费数字分别汇总到239.99和219.98。他们显然需要分别聚合到240和220.

当小时数改变时(通过使用jQuery on change功能)计算成本和计费数字。乘数是通过将Original Value Hours除以下面Calculated Values Hours中指定的数字来确定的。

(0.2 / 0.7)= 0.28571428571428575

(0.3 / 0.7)= 0.4285714285714286

不言而喻,数字需要汇总到原始值。

这个问题无疑与浮点精度和舍入有关,我尝试使用以下函数但没有成功: -

    function to2DP(num, fixed) {
        var re = new RegExp('^-?\\d+(?:\.\\d{0,' + (fixed || -1) + '})?');
        return num.toString().match(re)[0];
    }   

    $("#splitTimeContainer").on("change", ".changeHours", function(e) {
        var splitID = $("#splitID").val();
        var splitOrigCost = $("#splitOrigCost").val();
        var splitOrigBilled = $("#splitOrigBilled").val();
        var splitOrigHours = $("#splitOrigHours").val();
        var i = 1;

        var divideMe = $(this).val();

        var coEfficient = (divideMe/splitOrigHours);

        var newCost = to2DP((coEfficient * splitOrigCost), 2);

        var newBilled = to2DP((coEfficient * splitOrigBilled), 2);

        var parent = $(this).parent().parent();

        parent.find('.changeCost').val(newCost);

        parent.find('.changeBilled').val(newBilled);

    });

除了使用toFixed外,还没有成功。

任何人对我如何实现这一目标都有任何建议?

2 个答案:

答案 0 :(得分:0)

这个问题更多的是关于舍入和数学。

  • 我建议使用不同的舍入to even。这种四舍五入至少没有偏见,因此不会系统地增加或减少数值。
  • 另一个问题是,即使进行此舍入,也无法保证由于奇数个计算值而值的总和将匹配。

在这个特殊的例子中,这种四舍五入将达到240,并且收费为220.01。 我认为这个问题没有最优解决方案。 考虑一下:

Hours: 0.9, Cost 100
hours: 0.3, cost 33.33
hours: 0.3, cost 33.33
hours: 0.3, cost 33.33

如何使这项工作无法实现。

答案 1 :(得分:0)

您可能需要考虑将除法期间丢失的金额添加到一个或多个值。

Splitwise也这样做是为了确保没有价值损失。