using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace JSMachine.WMS.Common.Helper { public static class MathExtensions { /// /// 四舍五入(适用decimal类型) /// /// 要舍入的小数 /// 保留的小数位(负数则不处理) /// public static decimal Round(decimal? d, int decimals = 2) { if (!d.HasValue) return 0; return decimals < 0 ? d.Value : Math.Round(d.Value, decimals, MidpointRounding.AwayFromZero); } /// /// 数学函数扩展-幂运算xⁿ /// /// 底数 /// 指数 /// 保留的小数位(负数则不处理) /// public static decimal Pow(decimal x, decimal n, int decimals = -1) { decimal result = (decimal)Math.Pow((double)x, (double)n); return Round(result, decimals); } /// /// 数学函数扩展-安全除 /// /// 被除数 /// 除数 /// 保留的小数位(负数则不处理) /// public static decimal Division(decimal first, decimal second, int decimals = -1) { decimal result = second == 0 ? 0 : (first / second); return Round(result, decimals); } /// /// 数学函数扩展-安全除 /// /// 被除数 /// 除数 /// public static int Division(int first, int second) { int result = second == 0 ? 0 : (first / second); return result; } /// /// 数学函数扩展-安全取余 DY20210312 /// /// 被除数 /// 除数 /// public static int Remainder(int first, int second) { int result = second == 0 ? 0 : (first % second); return result; } /// /// 向下取整 /// /// 被除数 /// 除数 /// public static int Floor(int first, int second) { decimal result = second == 0 ? 0 : (first / second); return (int)Math.Floor(result); } /// /// 向下取整 /// /// 被除数 /// 数据 /// public static int Floor(decimal first, decimal second) { decimal result = second == 0 ? 0 : (Convert.ToDecimal(first) / Convert.ToDecimal(second)); //判断是否整除 if (!StringCheck(result.ToString())) { return (int)Math.Floor(result) - 1; } return (int)result; } /// /// 安全除(计算结果为正负无穷大时,返回0) /// /// 被除数 /// 除数 /// 保留的小数位(负数则不处理) /// public static double Division(double first, double second, int decimals = -1) { // double类型不能直接判断0,会有精度丢失 // 而当除数=0时,计算结果=正负无穷大,并不会报错 if (second == 0) { return 0; } else { double result = first / second; result = double.IsInfinity(result) ? 0 : result; return decimals < 0 ? result : Math.Round(result, decimals); } } /// /// 两个数据是否相等 /// /// /// /// 保留位数 /// 阀值 /// public static bool IsEqual(decimal first, decimal second, int decimals = 2, decimal threshold = 0.001m) { return Math.Abs(Math.Round(first, decimals) - Math.Round(second, decimals)) <= threshold; } /// /// 向上取整 /// /// 被除数 /// 除数 /// public static int Up(int first, int second) { decimal result = second == 0 ? 0 : (Convert.ToDecimal(first) / Convert.ToDecimal(second)); //判断是否整除 if (result.ToString().Contains(".")) return (int)Math.Floor(result) + 1; return (int)result; } /// /// 向上取整 /// /// 被除数 /// 除数 /// public static int Up(double first, int second) { decimal result = second == 0 ? 0 : (Convert.ToDecimal(first) / Convert.ToDecimal(second)); //判断是否整除 if (result.ToString().Contains(".")) return (int)Math.Floor(result) + 1; return (int)result; } /// /// 向上取整 /// /// 被除数 /// 数据 /// public static int Up(decimal first, decimal second) { decimal result = second == 0 ? 0 : (Convert.ToDecimal(first) / Convert.ToDecimal(second)); //判断是否整除 if (!StringCheck(result.ToString())) { return (int)Math.Floor(result) + 1; } return (int)result; } /// ///判断最终结果,.Contains(".")作为判断依据是不对的,15.0000就会变成16,是错的 /// /// /// public static bool StringCheck(string result) { string[] sArray = result.Split("."); if (sArray.Length >= 2) { Regex r; string pattern; pattern = @"1|2|3|4|5|6|7|8|9"; r = new Regex(pattern); if (r.IsMatch(sArray[1])) { return true; } else { return false; } } else { return true; } } } }