/// <summary>
/// 用于四舍五入计算
/// </summary>
public class NumberRound
{
public enum RoundType
{
/// <summary>
/// 无条件进位
/// </summary>
CarryBit,
/// <summary>
/// 无条件舍去
/// </summary>
Rejection
}
/// <summary>
/// 无条件进位
/// </summary>
/// <param name="d">要进行进位的数</param>
/// <param name="dec">保留几点小数</param>
/// <returns>返回值</returns>
private static double RoundCarryBit(double d, int dec)
{
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
try
{
return (Math.Ceiling(d * (Math.Pow(10, dec)))) / (Math.Pow(10, dec));
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 无条件舍去
/// </summary>
/// <param name="d">要进行舍去的数</param>
/// <param name="dec">保留几点小数</param>
/// <returns>返回值</returns>
private static double RoundRejection(double d, int dec)
{
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
try
{
return (Math.Floor(d * (Math.Pow(10, dec)))) / (Math.Pow(10, dec));
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 无条件舍去或进位
/// </summary>
/// <param name="d">要进行计算的数</param>
/// <param name="dec">保留几位小数</param>
/// <param name="type">计算类型:舍去还是进位</param>
/// <returns></returns>
public static double Round(double d, int dec, RoundType type)
{
if (type == RoundType.CarryBit)
return RoundCarryBit(d, dec);
else if (type == RoundType.Rejection)
return RoundRejection(d, dec);
else
return Round(d, dec);
}
/// <summary>
/// 四舍五入
/// </summary>
/// <param name="d">要四舍五入的数</param>
/// <param name="dec">保留几点小数</param>
/// <returns>返回四舍五入后的值</returns>
public static double Round(double d, int dec)
{
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
return double.Parse(d.ToString("F" + dec));
}
/// <summary>
/// 自定义四舍五入
/// </summary>
/// <param name="d">要四舍五入的数</param>
/// <param name="dec">保留几点小数</param>
/// <param name="sign">遇几进位</param>
/// <returns>返回四舍五入后的值</returns>
public static double Round(double d, int dec, int sign)
{
if (sign > 9)
throw new OverflowException("进位标识不能大于9");
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
double tobe = (Math.Pow(10, dec));
double toInt = (Math.Floor(d * tobe));
double terminal = d - (toInt / tobe);
string test = terminal.ToString("n3");
if (terminal > 0)
{
if (Math.Floor(Convert.ToDouble(test) * tobe * 10) >= sign)
{
return ((toInt + 1) / tobe);
}
return toInt / tobe;
}
return d;
}
}
/// 用于四舍五入计算
/// </summary>
public class NumberRound
{
public enum RoundType
{
/// <summary>
/// 无条件进位
/// </summary>
CarryBit,
/// <summary>
/// 无条件舍去
/// </summary>
Rejection
}
/// <summary>
/// 无条件进位
/// </summary>
/// <param name="d">要进行进位的数</param>
/// <param name="dec">保留几点小数</param>
/// <returns>返回值</returns>
private static double RoundCarryBit(double d, int dec)
{
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
try
{
return (Math.Ceiling(d * (Math.Pow(10, dec)))) / (Math.Pow(10, dec));
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 无条件舍去
/// </summary>
/// <param name="d">要进行舍去的数</param>
/// <param name="dec">保留几点小数</param>
/// <returns>返回值</returns>
private static double RoundRejection(double d, int dec)
{
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
try
{
return (Math.Floor(d * (Math.Pow(10, dec)))) / (Math.Pow(10, dec));
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 无条件舍去或进位
/// </summary>
/// <param name="d">要进行计算的数</param>
/// <param name="dec">保留几位小数</param>
/// <param name="type">计算类型:舍去还是进位</param>
/// <returns></returns>
public static double Round(double d, int dec, RoundType type)
{
if (type == RoundType.CarryBit)
return RoundCarryBit(d, dec);
else if (type == RoundType.Rejection)
return RoundRejection(d, dec);
else
return Round(d, dec);
}
/// <summary>
/// 四舍五入
/// </summary>
/// <param name="d">要四舍五入的数</param>
/// <param name="dec">保留几点小数</param>
/// <returns>返回四舍五入后的值</returns>
public static double Round(double d, int dec)
{
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
return double.Parse(d.ToString("F" + dec));
}
/// <summary>
/// 自定义四舍五入
/// </summary>
/// <param name="d">要四舍五入的数</param>
/// <param name="dec">保留几点小数</param>
/// <param name="sign">遇几进位</param>
/// <returns>返回四舍五入后的值</returns>
public static double Round(double d, int dec, int sign)
{
if (sign > 9)
throw new OverflowException("进位标识不能大于9");
if (dec > 10)
throw new OverflowException("小数点后最多保留10位小数");
double tobe = (Math.Pow(10, dec));
double toInt = (Math.Floor(d * tobe));
double terminal = d - (toInt / tobe);
string test = terminal.ToString("n3");
if (terminal > 0)
{
if (Math.Floor(Convert.ToDouble(test) * tobe * 10) >= sign)
{
return ((toInt + 1) / tobe);
}
return toInt / tobe;
}
return d;
}
}