我可以强制百分比总和到一个确切的值吗?

时间:2018-06-07 17:27:39

标签: javascript ember.js

我有一个固定的税收值,比如50,00美元,我想在人们之间分配这个税。因此,一个人可以选择他将支付多少税款。一旦这个人选择了配额,其余的税收就会分配给其他人。

我已经制作了一个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美元?

1 个答案:

答案 0 :(得分:1)

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

假设您要在三个人之间划分50美元的税... ... 50/3 = 16.6666666 ...假设它是一种货币并且您向上舍入到两位小数,每个人支付16.66美元,总和是16.66 * 3 = 49.98。

如果没有要求所有人每次都支付完全相同的税额,我只是加/减第一人的差异:

    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));
            }                 
        }
    });