2016-06-22 4 views
0

스케일링 된 속도를 가진 meterID의 가격을 계산하려고합니다. 나는 그것이 같다 내가 계산기에 수량 X의 가격을 요구하는 경우 푸른 가격 계산기에서 가격 비교 알고리즘 (공공 정적 더블 computeRatedUsagePerMeter (사전 요금을 두 번 사용)) https://github.com/PartnerCenterSamples/Commerce-API-DotNet/blob/master/Usage.cs푸른 색 사용 비율 스케일링 가격

에 대한 지침으로이 를 사용 위의 방법으로 계산하지만 수량 X - 1에 대한 가격.

Microsoft에서 제공하는 방법이 완전한지 아닌지, 아니면 올바른 방향에 대한 힌트 일 경우 혼란 스럽습니다. 푸른 가격 계산기 동안 수량 1 = 0.084330의 가격 상기 링크에 의해 제공되는 방법에 따르면


{ 
     "MeterId": "d23a5753-ff85-4ddf-af28-8cc5cf2d3882", 
     "MeterName": "Standard IO - Page Blob/Disk (GB)", 
     "MeterCategory": "Storage", 
     "MeterSubCategory": "Locally Redundant", 
     "Unit": "GB", 
     "MeterTags": [], 
     "MeterRegion": "", 
     "MeterRates": { 
     "0": 0.042165, 
     "1024": 0.0421650, 
     "51200": 0.0421650, 
     "512000": 0.0421650, 
     "1024000": 0.0379485, 
     "5120000": 0.0312021 
     }, 
     "EffectiveDate": "2014-02-01T00:00:00Z", 
     "IncludedQuantity": 0.0 
    } 


private static decimal computeRatedUsagePerMeter(Dictionary<decimal, decimal> rates, decimal usage) 
     { 
      decimal total = Decimal.Zero; 

      if (rates.Count == 0) 
       return Decimal.Zero; 
      else if (rates.Count == 1) 
       return (usage * rates.Values.FirstOrDefault()); 

      var remainingUsage = usage; 

      while (rates.Count > 0) 
      { 
       decimal LastKey = rates.Keys.Last(); 

       if (remainingUsage > LastKey) 
       { 
        decimal LastKeyValue = Decimal.Zero; 
        if (rates.TryGetValue(LastKey, out LastKeyValue)) 
        { 
         total = total + ((remainingUsage - LastKey + 1) * LastKeyValue); // remainingUsage - LastKey +1 because tiered pricing is exclusive 
         remainingUsage = LastKey - 1; 
        } 
        rates.Remove(LastKey); 
       } 
       else if (remainingUsage <= LastKey) 
       { 
        rates.Remove(LastKey); 
       } 
      } 
      return total; 
     } 
0.04 (가격은 EUR에서)

을 준다 그리고 또 다른 예 : les은 100 개의 수량을 말합니다.

방법 : 4.258665 EUR

푸른 계산기 = 4.22 EUR

4.22 EUR 인 반올림 99 수량 = 4.216500위한 방법. azure calculator 도 확인할 수 없습니다. < 1.00은 0.5 수량 (이 경우 GB 단위로 측정되므로 0,5 GB는 완벽하게 합리적인 수량 임)으로 계산할 수 있습니다. 원인은 가격 계산기가 소수를 허용하지 않기 때문입니다.

+0

예제를 포함시킬 수 있습니까? –

+0

JSON 코드는 무엇을 계산해야합니까? 사용하는 코드, 예상 결과 및 실제로 반환 된 코드를 게시하십시오.* 비슷한 * 코드 –

+0

에 대한 링크가 아니며 코드도 추가됩니다. 코드가 비슷하지만 정확히 동일하지는 않습니다. – isioutis

답변

1

푸른 가격 계산기를 제공하는 동안 수량 1 = 0.084330의 가격 위의 링크에서 제공하는 방법에 따라 0.04

은 위의 코드를 보면합니다 ( 가격은 EUR에), I 코드 자체에 문제가 있다고 생각합니다. 본질적으로 0 - 1023 범위에 해당하는 1GB의 스토리지 가격을 찾으려고합니다. 즉 LastKey의 값은 0입니다. 그래서 다음 코드는 실행시 : 그것은 당신에게 0.084330 (0 + (1 - 0 + 1) * 0.042165)의 총을 제공

total = total + ((remainingUsage - LastKey + 1) * LastKeyValue); 

.

또한 원인 가격 계산기 소수를 허용하지 않는 (그래서 0.5 GB 완벽하게 합리적인 수량이 경우는 GB 단위로 측정) < 1.00 0.5 수량이 말을 할 수있는 가격을 확인할 수 없습니다.

마이크로 소프트가 설계 한 방식대로 계산기를 설계 한 이유에 대해 적절한 답변을 제공 할 것이라고 확신합니다.

+0

난 단지 코드가 마이크로 소프트의 하늘빛 기스 (gureub)에서 가져온 것이고 그 차이는 십진법으로 두배로 바뀐다는 것을 분명히 밝히고 싶다. 정말로 잘못된 점이 있음을 지적 해 주셔서 감사합니다. – isioutis

+0

심지어 Microsoft는 실수가 허용됩니다 :) –