Skip to content

Commit

Permalink
修正了数值分摊上存在的一个bug
Browse files Browse the repository at this point in the history
  • Loading branch information
guogangj committed Mar 1, 2023
1 parent f2454c0 commit 7bf54fc
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 18 deletions.
35 changes: 18 additions & 17 deletions AlgorithmLib/NumberDivideHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,21 @@ public static class NumberDivideHelper {
/// <param name="scale">比例</param>
/// <param name="decimalNum">小数位数(0-6),默认-1表示不限</param>
/// <returns></returns>
public static decimal[] Divide(decimal total, decimal[] scale, int decimalNum=-1) {
if(decimalNum!=-1 && decimal.Round(total, decimalNum)!=total) {
public static decimal[] Divide(decimal total, decimal[] scale, int decimalNum = -1) {
if (decimalNum != -1 && decimal.Round(total, decimalNum) != total) {
throw new ArgumentException("Cannot divide the number due to its decimal number is more than specified value");
}
int partNum = scale.Length;
decimal[] result = new decimal[partNum];
if(partNum==0) {
if (partNum == 0) {
return result;
}

if(scale.Any(d=>d<0m)) {
if (scale.Any(d => d < 0m)) {
throw new ArgumentException("Divide scale cannot be less than 0");
}
decimal scaleSum = scale.Sum();
if(scaleSum==0m) {
if (scaleSum == 0m) {
throw new ArgumentException("Divide total scale cannot be equal to 0");
}

Expand All @@ -44,29 +44,30 @@ public static decimal[] Divide(decimal total, decimal[] scale, int decimalNum=-1
}

//尝试执行分摊
for (int i=0; i<partNum; i++) {
for (int i = 0; i < partNum; i++) {
result[i] = total * scale[i] / scaleSum;
if(decimalNum!=-1) {

if (decimalNum != -1) {

result[i] = decimal.Round(result[i], decimalNum);
}
}

decimal totalTest = result.Sum();
decimal remainder = total - totalTest;
if(remainder==0m) {
if (remainder == 0m) {
return result;
}
if(remainder>0) {
//摊到最大的上面
int maxIdx = 0;
for(int i=1; i<result.Length; i++) {
if(result[i] > result[maxIdx]) {
maxIdx = i;
}

//摊到最大的上面
int maxIdx = 0;
for (int i = 1; i < result.Length; i++) {
if (result[i] > result[maxIdx]) {
maxIdx = i;
}
result[maxIdx] += remainder;
}

result[maxIdx] += remainder;

return result;
}
}
Expand Down
6 changes: 5 additions & 1 deletion AlgorithmLibDemo/Demos.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,11 @@ void PrintDivInfo() {
PrintDivInfo();
Utils.SimplePrintArray(NumberDivideHelper.Divide(toDivide, ratioArray, decimalNum));

toDivide = 3131;
ratioArray = new[] { 1m, 1m, 1m };
decimalNum = 3;
PrintDivInfo();
Utils.SimplePrintArray(NumberDivideHelper.Divide(toDivide, ratioArray, decimalNum));

toDivide = 10.1m;
ratioArray = new[] { 5m, 1m, 0.1m };
Expand All @@ -119,7 +124,6 @@ void PrintDivInfo() {
}
}


/// <summary>
/// 找出关系DEMO
/// </summary>
Expand Down

0 comments on commit 7bf54fc

Please sign in to comment.