我尝试计算具有比例费率的meterID的价格。我用这个 作为算法的指南(public static double computeRatedUsagePerMeter(Dictionary rates,double usage)) https://github.com/PartnerCenterSamples/Commerce-API-DotNet/blob/master/Usage.cs
与azure定价计算器的价格相比,如果我在计算器中询问数量X的价格,它等于我从上述方法计算的价格,但数量为X - 1.
因此,如果Microsoft提供的方法是否完整,或者只是提示正确的方向,我会感到困惑。
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;
}
{
"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
}
根据上面链接提供的方法,数量1的价格= 0.084330,而天蓝色定价计算器给出0.04 (价格以欧元计算)
另一个例子:说100量。
方法:4.258665 EUR
Azure计算器= 4.22 EUR
方法99量= 4.216500,舍入为4.22欧元。 也无法检查价格&lt; 1.00让我们说0.5数量(在这种情况下,它以GB为单位测量,因此0,5 GB是完全合理的数量)因为定价计算器不允许小数。
答案 0 :(得分:1)
根据以上链接提供的方法价格为 数量1 = 0.084330,而天蓝色定价计算器给出0.04( 价格以欧元计算)
查看上面的代码,我相信代码本身存在问题。基本上,您正在尝试查找1 GB存储空间的价格,该价格低于0 - 1023
范围,换句话说,LastKey
的值为0
。因此,当执行以下代码时:
total = total + ((remainingUsage - LastKey + 1) * LastKeyValue);
它总共为您提供0.084330
(0 + (1 - 0 + 1) * 0.042165
)。
也无法检查价格&lt; 1.00让0.5量(在此 案例以GB为单位测量,因此0,5 GB是完全合理的数量) 因为定价计算器不允许小数。
我相信微软的某个人会为他们设计计算器的原因提供一个正确的答案。