我可以强制百分比总和为精确值吗?
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));
}
}
});
我有一个固定的税值,比如 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));
}
}
});