diff --git a/Model/GradeResult/Entity/Enums/Accuracy.cs b/Model/GradeResult/Entity/Enums/Accuracy.cs index 7f252d1..9149206 100644 --- a/Model/GradeResult/Entity/Enums/Accuracy.cs +++ b/Model/GradeResult/Entity/Enums/Accuracy.cs @@ -6,14 +6,35 @@ public enum Accuracy { [Description("强制保留两位小数,向下取整(ZDZ1)")] ForceTwoDecimals = 1, + [Description("强制保留一位小数,向下取整(ZD1)")] ForceOneDecimal = 2, + [Description("将数值舍入到最近的 0.5 倍数(ZD5)")] HalfStepRounding = 3, + [Description("将数值舍入到最近的 5 的整数倍(Z5)")] MultipleOfFive = 4, + [Description("将数值舍入到最近的0.2倍数(ZD2)")] DecimalTwoStepRounding = 5, + [Description("强制向下取整为整数(Floor)")] - IntegerFloor = 6 + IntegerFloor = 6, + + [Description("将数值乘以100后向下取整,并保留一位小数(P100)")] + Multiply100FloorOneDecimal = 7, + + [Description("将数值乘以100后向下取整,并保留两位小数(P100_2)")] + Multiply100FloorTwoDecimals = 8, + + [Description("将数值乘以10后向下取整,并保留一位小数(A10)")] + Multiply10FloorOneDecimal = 9, + [Description("将数值乘以100后向下取整为整数(M100Floor)")] + Multiply100FloorToInteger = 10, + [Description("将数值乘以100后舍入到最近的0.5倍数(M100Half)")] + Multiply100HalfStepRounding = 11, + [Description("将数值乘以100后舍入到最近的5的倍数(M100Z5)")] + Multiply100MultipleOfFive = 13, + } \ No newline at end of file diff --git a/Model/GradeResult/Helper/DoubleDataFormatHelper.cs b/Model/GradeResult/Helper/DoubleDataFormatHelper.cs index 21591fd..a31f726 100644 --- a/Model/GradeResult/Helper/DoubleDataFormatHelper.cs +++ b/Model/GradeResult/Helper/DoubleDataFormatHelper.cs @@ -43,6 +43,42 @@ public static class DoubleDataFormatHelper return (Math.Floor(value * 10000) / 100).ToString("f2"); } + public static double RoundFiveDownSixUp(double value) + { + // 提取整数部分 + double integerPart = Math.Truncate(value); + // 提取小数部分 + double fractionalPart = value - integerPart; + + // 判断小数部分是否大于 0.5 + return fractionalPart > 0.5 ? integerPart + 1 : integerPart; + } + public static double RoundToPointTwo(double value) + { + // 转换到10倍精度空间处理 + double scaled = value * 10; + double remainder = scaled % 2; // 求模得到余数 + + // 核心舍入规则:余数>=1.5时进位 + return remainder >= 1.5 ? (scaled - remainder + 2) / 10 : (scaled - remainder) / 10; + } + + /// + /// 直接值(角度,直径)用的小数格式化 + /// + /// + /// + [Log] + public static string FormatDouble_A(double value) + { + return (Math.Floor(value * 10) / 10).ToString(DigitsFormat); + } + [Log] + public static string FormatDouble_A2(double value) + { + return (Math.Floor(value * 100) / 100).ToString("f2"); + } + /// /// 百分比用的小数格式化 /// @@ -102,7 +138,7 @@ public static class DoubleDataFormatHelper /// /// [Log] - public static string FormatDouble(object? value, Accuracy accuracy) + public static string FormatDouble(object? value, Accuracy accuracy) { string result = ""; @@ -123,75 +159,60 @@ public static class DoubleDataFormatHelper result = (Math.Floor(dvalue * 10) / 10).ToString("f1"); break; case Accuracy.HalfStepRounding: - result = (RoundFiveDownSixUp(dvalue * 2) / 2).ToString("f1"); + result = (Math.Round(dvalue * 2) / 2).ToString("f1"); break; case Accuracy.MultipleOfFive: - result = (RoundFiveDownSixUp(dvalue / 5) * 5).ToString(); + result = (Math.Round(dvalue / 5) * 5).ToString(); break; case Accuracy.DecimalTwoStepRounding: - result = RoundToPointTwo(dvalue).ToString("f1"); // 保留1位小数 + result = (Math.Round(dvalue * 5) / 5).ToString("f1"); break; case Accuracy.IntegerFloor: - result = Math.Floor(dvalue).ToString("F1"); // 直接取整 + result = Math.Floor(dvalue).ToString(); + break; + case Accuracy.Multiply100FloorOneDecimal: + result = (Math.Floor(dvalue * 1000) / 10).ToString("f1"); + break; + case Accuracy.Multiply100FloorTwoDecimals: + result = (Math.Floor(dvalue * 10000) / 100).ToString("f2"); + break; + case Accuracy.Multiply10FloorOneDecimal: + result = (Math.Floor(dvalue * 10) / 10).ToString("f1"); + break; + case Accuracy.Multiply100HalfStepRounding: + result = (Math.Round(dvalue * 100 * 2) / 2).ToString("f1"); + break; + case Accuracy.Multiply100MultipleOfFive: + result = (Math.Round(dvalue * 100 / 5) * 5).ToString(); break; } } else { - //工厂模式不量化 + // 工厂模式简化处理 switch (accuracy) { case Accuracy.ForceTwoDecimals: + case Accuracy.Multiply100FloorTwoDecimals: result = (Math.Floor(dvalue * 100) / 100).ToString("f2"); break; - case Accuracy.HalfStepRounding: case Accuracy.ForceOneDecimal: + case Accuracy.HalfStepRounding: case Accuracy.DecimalTwoStepRounding: - case Accuracy.IntegerFloor: - case Accuracy.MultipleOfFive: + case Accuracy.Multiply100FloorOneDecimal: + case Accuracy.Multiply10FloorOneDecimal: result = (Math.Floor(dvalue * 10) / 10).ToString("f1"); break; + case Accuracy.MultipleOfFive: + case Accuracy.IntegerFloor: + result = Math.Floor(dvalue).ToString("f0"); + break; } } return result; } [Log] - public static double RoundFiveDownSixUp(double value) - { - // 提取整数部分 - double integerPart = Math.Truncate(value); - // 提取小数部分 - double fractionalPart = value - integerPart; - - // 判断小数部分是否大于 0.5 - return fractionalPart > 0.5 ? integerPart + 1 : integerPart; - } - public static double RoundToPointTwo(double value) - { - // 转换到10倍精度空间处理 - double scaled = value * 10; - double remainder = scaled % 2; // 求模得到余数 - - // 核心舍入规则:余数>=1.5时进位 - return remainder >= 1.5 ? (scaled - remainder + 2) / 10 : (scaled - remainder) / 10; - } - - /// - /// 直接值(角度,直径)用的小数格式化 - /// - /// - /// - [Log] - public static string FormatDouble_A(double value) - { - return (Math.Floor(value * 10) / 10).ToString(DigitsFormat); - } - [Log] - public static string FormatDouble_A2(double value) - { - return (Math.Floor(value * 100) / 100).ToString("f2"); - } public static Accuracy ToAccuracy(this string value) { if (string.IsNullOrEmpty(value))