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;
}
}
}
}