我可以强制百分比总和为精确值吗?

Can I force percentages to sum up to a exact value?

我有一个固定的税值,比如 50,00 美元,我想将这笔税分给人们。所以,一个人可以 select 他要交多少税。一旦这个人 select 达到了配额,剩下的税就分给其他人。

我已经制作了一个 javascript(我正在使用 EmberJs)函数来自动执行此操作,但有时价值被评估为超过 50 美元,有时甚至更少。

我的函数:

 percentageFromValue(person, selectedValue){
        selectedValue = selectedValue.replace(/[R$\s]/g,'');
        selectedValue = selectedValue.replace(/[,]/g,'.');
        selectedValue = parseFloat(selectedValue);
        let taxValue= this.get('taxValue'); 
        ///nao deixar valor utrapasse o valor da taxa
        if(selectedValue> taxValue)
            valor = taxValue;

        let personPercentage = (selectedValue*100.0 / taxValue);
        personPercentage = parseFloat(personPercentage );
        let parcialSum= 0;


        person.set('pctTax',personPercentage.toFixed(2));

        let remainingPercent= 100.0 - personPercentage ;
        let totalPersons = this.get('persons.length');
        let pctPerPerson= remainingPercent/ (totalPersons - 1);
        let valuePerPerson= (pctPerPerson* taxValue) / 100.0;

        this.get('persons').forEach(r =>{
            if(person.get('id') != r.get('id')){
                r.set('pctTax',pctPerPerson);
                r.set('value',valuePerPerson.toFixed(2));
            }
        });

    },

我怎样才能让这个自动再分配总和达到 50,00 美元?

这更像是一个舍入问题而不是编程问题。

假设您想将 50 美元的税分给三个人...50/3 = 16.6666666...假设它是一种货币并且您四舍五入到小数点后两位,则每人支付 16.66 美元,总和为 16.66 * 3 = 49.98.

如果没有要求所有人每次都缴纳完全相同的税额,我只add/subtract与第一个人的四舍五入差:

    let remainingPercent= 100.0 - personPercentage ;
    let totalPersons = this.get('persons.length');
    let pctPerPerson= remainingPercent/ (totalPersons - 1);
    let valuePerPerson= (pctPerPerson* taxValue) / 100.0;
    let roundingError = taxValue - pctPerPerson * totalPersons;

    this.get('persons').forEach(r =>{
        if(person.get('id') != r.get('id')){
            r.set('pctTax',pctPerPerson);
            if (this.indexOf(r) == 0) {
              r.set('value',valuePerPerson.toFixed(2) + roundingError);
            } else {
              r.set('value',valuePerPerson.toFixed(2));
            }                 
        }
    });