所以我试图创建一个页面,我可以为可变数量的人划分给定的金额。该除法的总和必须始终相同并等于初始值。
我面临很多困难,因为AngularJS上的范围输入总是返回一个字符串,所以我必须将它转换为float,然后将它乘以100,这样我就可以在不面对浮点精度问题的情况下进行计算
另一个问题是,当人员之间的划分不准确时,如100€/ 3,它将给出33,3333(3)。我理想的做法是这样的:33,33 + 33,33 + 33,34。
与之前的问题相关,有时我会获得超过2位小数的值。
你可以在这个codepen中找到一个工作的例子,当一个范围输入被改变时,所有其他的输入以相反的方式更新(当我增加一个时,其他的必须减少,反之亦然)。
注意:通过点击和拖动工作范围输入不必点击您想要的位置(它们用于触摸设备),您也只能在&#时移动它们34;等量"被禁用。
控制器代码在这里:
angular.module('ionicApp')
.controller('HomeTabCtrl', function($scope) {
$scope.stuff = {
persons: [],
max: 100,
equal: true
};
$scope.addPerson = function(){
var person = {
expenseValue: 0
};
$scope.stuff.persons.push(person);
$scope.recalcTotal(-1);
};
$scope.recalcTotal = function(index){
var i = 0;
var length = $scope.stuff.persons.length;
if($scope.stuff.equal){
var equalExpense = $scope.stuff.max / length;
for(i = 0; i < length; i++){
$scope.stuff.persons[i].expenseValue = equalExpense;
}
}else if(index > 0){
var total = 0;
var delta = 0;
var i = 0;
for (i = 0; i < length; i++) {
$scope.stuff.persons[i].expenseValue = parseFloat($scope.stuff.persons[i].expenseValue) * 100;
total += $scope.stuff.persons[i].expenseValue;
}
delta = ($scope.stuff.max * 100 - total)/length;
for (i = 0; i < length; i++) {
if(i !== index){
$scope.stuff.persons[i].expenseValue = _calcNewValue(delta, $scope.stuff.persons[index].expenseValue, $scope.stuff.persons[i].expenseValue);
}
}
$scope.stuff.persons[index].expenseValue = $scope.stuff.persons[index].expenseValue / 100;
}
};
function _calcNewValue(delta, value, userExpense){
var newValue = userExpense + delta;
if (newValue < 0 || value === $scope.stuff.max * 100){
newValue = 0;
}
else if (newValue > $scope.stuff.max * 100){
newValue = $scope.stuff.max * 100;
}
return newValue / 100;
}
});