2017-12-10 4 views
0

돈을 벌고 싶은 곳을 선택할 때 humblebundle.com에있는 슬라이더를 알고 있습니까? 한 비율을 조정하면 자동으로 나머지를 조정합니다.JS에서 Humble Bundle과 같은 비율을 계산하십시오.

$ 20에서 $ 5로 팁을 조정하고 싶어도 $ 20를 지불한다고하면 다른 물건에 있던 비율이 자동으로 낮아져서 일치하지는 않습니다. 하기.

var settip = 50; 
var tip = 5; 
var devs = 75; 
var donation = 20; 

tip = settip; 
var newAvail = 100 - tip; 
var rCalc = 100 - (devs + donation); 

devs = ((devs + rCalc) * newAvail) * .01; 
donation = ((donation + rCalc) * newAvail) * .01; 

console.log("New Ratio Calculation: " + rCalc); 
console.log("New available space: " + newAvail); 
console.log(tip); 
console.log(devs); 
console.log(donation); 

콘솔 로그 그냥 내가 시도 할 수 있으며, 일이 잘못 어디로 가고 내 머리에 함께 넣어입니다 : 내가 수학적으로 얻을로

이는 가까운 거리에 있습니다. 또한 자바 스크립트가 정확하지 않고 매번 수정 코드를 수행하고 싶지 않기 때문에 숫자가 처음에는 정수가됩니다. 즉, .5 대신 50을 사용하고 코드를 먼저 작성한 다음 최적화 방법을 생각하는 것이 좋습니다. .

누군가가 방법에 대해 안내 할 수 있거나 내가 여기에 잘못 가고 있다면, 그 것이 좋을 것입니다. 감사.

팁은 번들 제작자에게 팁입니다. Devs는 개발자에게 팁입니다. 기부금은 기부금 상자에 팁입니다.

각 숫자는 비율입니다. Settip은 새로운 비율입니다. 하나의 값을 변경하고 다른 모든 값을 자동으로 변경해야하지만 첫 번째 부분을 수행하는 방법을 파악할 수 없기 때문에 두 번째 부분을 만들려고 시도 할 수 없습니다. 그것은 실제로 기능적입니다.

답변

0

내가 생각하는 바를 다시 말해서 : tip, devsdonation의 세 변수는 항상 100의 합을 가져야합니다. 하나의 변수가 갱신 될 때, 다른 두 변수는 보상을 위해 갱신되어야합니다. 자동 업데이트는 서로 동일한 비율을 유지해야합니다 (예 : donation이 두 번 devs이고 팁이 업데이트 된 경우 업데이트 된 donation 값은 여전히 ​​devs 값의 두 배 여야 함). 나는 그 권리를 가지고있는 경우에

, 다음이 당신을 위해 작동합니다 :

var tips = 5; 
 
var devs = 20; 
 
var donation = 75; 
 

 
var setTips = function(newValue) { 
 
    tips = newValue; 
 
    var sum = devs + donation; 
 
    var devShare = devs/sum; // the share devs gets between devs and donation 
 
    var donationShare = 1 - devShare; // or could calculate as donation/sum 
 
    
 
    devs = (100 - tips) * devShare; // the remaining times it's share ratio 
 
    donation = (100 - tips) * donationShare; // the remaining times it's share ratio 
 
}; 
 

 
// test it out 
 
setTips(50); 
 
console.log(tips, devs, donation);

0

난 당신이 다른 포함 할 경우이 보일 수 있습니다으로이 문제가 쉽지 않다 생각 가장자리의 경우.

  1. 각각의 금액은 모두 양의
  2. 합계가 총 합계

가장 간단한 방법은 동일해야합니다 센트에서 전체의 정수 여야합니다 : 여기 당신은 다음과 같은 속성이 필요합니다, 그래서 당신이 돈을 배포한다고 가정 JS에서이를 처리하려면 정수 대신 정수 (예 : 달러 대신 센트)를 사용하여 모든 계산을 수행하고 UI에서 사람이 읽을 수있는 방식으로 형식을 지정해야합니다.

function updateRates(rates, newValue, index) { 
    var i, len = rates.length; 
    var sum = 0; 
    for (i = 0; i < len; i++) 
     sum += rates[i]; 
    var oldValue = rates[index]; 
    var newRest = sum - newValue; 
    var curRest = sum - rates[index]; 
    rates[index] = newValue; 
    var remainders = new Array(len); 
    var fraction, value, subsum = 0; 
    for (i = 0; i < len; i++) { 
     if (i === index) continue; 

     // special case, all other sliders were at 0 - split value equally 
     if (curRest === 0) { 
      fraction = 1.0/(len - 1) 
     } 
     else { 
      fraction = rates[i]/curRest 
     } 
     value = newRest * fraction; 
     rates[i] = Math.floor(value); // always round down and then distribute rest according to the Largest remainder method 
     subsum += rates[i]; 
     remainders[i] = { 
      index: i, 
      value: value - rates[i] 
     }; 
    } 
    // sort remainders and distribute rest (fractions) accordingly 
    remainders.sort(function (a, b) { 
     var av = a.value; 
     var bv = b.value; 
     if (av === bv) 
      return 0; 
     if (av < bv) 
      return 1; 
     else 
      return -1; 
    }); 
    for (i = 0; subsum < newRest; i++) { 
     rates[remainders[i].index] += 1; 
     subsum += 1; 
    } 

    return rates; 
} 

일부가 아닌 사소한 테스트 :

1. updateRates([85,10,5], 82, 0) => [82, 12, 6] 
2. updateRates([85,10,5], 83, 0) => [83, 11, 6] 
3. updateRates([85,10,5], 84, 0) => [84, 11, 5] 
4. updateRates([100,0,0], 95, 0) => [95, 2, 3] 
5. updateRates([4,3,3,1], 0, 0) => [0, 5, 5, 1] 

에주의 5 예제 # 여전히조차 단순화와는 일부 비 사소한 코드가 필요합니다. 순진한 반올림을 사용하면 합계가 보존되지 않습니다.실제로 +43:3:1의 비율로 배포해야합니다. 즉, +12/7, +12/7+4/7을 추가해야합니다. 12/7 = 1 5/7부터 표준 수학 규칙에 따라 세 개 모두 반올림하여 +2, +2, +1이되지만, 우리는 +4 센트 만 배포 할 수 있습니다. 이 문제를 해결하기 위해 largest remainder method은 카테고리 사이에 분수 센트를 배포하는 데 사용됩니다. 간단히 말하면, 우리는 처음에 정수의 전체 수를 배포 (즉, 항상 반올림)하고 실제로 몇 센트가 남았는지 계산 한 다음 하나씩 차례로 분배하는 것입니다. 이 방법의 가장 큰 단점은 업데이트 후 동일한 값으로 시작하는 일부 요금이 다른 값을 가질 수 있다는 것입니다. 반면에 이것은 예제 # 4와 같이 피할 수 없습니다. 두 카테고리간에 5 센트를 동등하게 나눌 수 없습니다.

관련 문제