C#四舍五入用法实例

作者:jjt 时间:2021-07-20 02:49:20 

C# 中没有四舍五入函数,程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法

Bankers rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的。

Math.Round 方法默认的也是 Banker 舍入法

在 .NET 2.0 中 Math.Round 方法有几个重载方法


Math.Round(Decimal, MidpointRounding)
Math.Round(Double, MidpointRounding)
Math.Round(Decimal, Int32, MidpointRounding)
Math.Round(Double, Int32, MidpointRounding)

将小数值舍入到指定精度。MidpointRounding 参数,指定当一个值正好处于另两个数中间时如何舍入这个值

该参数是个 MidpointRounding 枚举

此枚举有两个成员,MSDN 中的说明是:
AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值。
ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。

注 意!这里关于 MidpointRounding.AwayFromZero 的说明是错误的!实际舍入为两个值中绝对值较大的值。不过 MSDN 中的 例子是正确的,英文描述原文是 it is rounded toward the nearest number that is away from zero.

所以,要实现四舍五入函数,对于正数,可以加一个 MidpointRounding.AwayFromZero 参数指定当一个数字是其他两个数字的中间值时其舍入为两个值中绝对值较大的值,例:


Math.Round(3.45, 2, MidpointRounding.AwayFromZero)

不过对于负数上面的方法就又不对了

因此需要自己写个函数来处理

第一个函数:


double Round(double value, int decimals)
{
if (value < 0)
{
return Math.Round(value + 5 / Math.Pow(10, decimals + 1), decimals, MidpointRounding.AwayFromZero);
}
else
{
return Math.Round(value, decimals, MidpointRounding.AwayFromZero);
}
}

第二个函数:


double Round(double d, int i)
{
if(d >=0)
{
d += 5 * Math.Pow(10, -(i + 1));
}
else
{
d += -5 * Math.Pow(10, -(i + 1));
}
string str = d.ToString();
string[] strs = str.Split('.');
int idot = str.IndexOf('.');
string prestr = strs[0];
string poststr = strs[1];
if(poststr.Length > i)
{
poststr = str.Substring(idot + 1, i);
}
string strd = prestr + "." + poststr;
d = Double.Parse(strd);
return d;
}

参数:d表示要四舍五入的数;i表示要保留的小数点后为数。

其中第二种方法是正负数都四舍五入,第一种方法是正数四舍五入,负数是五舍六入。

备注:个人认为第一种方法适合处理货币计算,而第二种方法适合数据统计的显示。

来源:http://www.cnblogs.com/jjt0624033/archive/2011/06/30/2094735.html

标签:C#,四舍五入
0
投稿

猜你喜欢

  • unity通过Mesh网格绘制图形球体

    2023-12-12 08:08:21
  • C#实现随机数产生类实例

    2021-11-16 15:46:49
  • C#实现的JS操作类实例

    2023-11-13 05:19:48
  • C# Email发送邮件 对方打开邮件可获得提醒

    2022-01-07 17:59:14
  • Spring+MyBatis实现数据读写分离的实例代码

    2021-08-31 04:34:48
  • C#使用Socket实现服务器与多个客户端通信(简单的聊天系统)

    2022-03-08 23:48:07
  • 如何使用JaCoCo分析java单元测试覆盖率

    2023-01-13 11:38:39
  • 深入学习Java编程中的字符串的进阶使用

    2023-11-11 12:54:20
  • Android Fragment概述及用法

    2022-08-23 15:54:22
  • 关于Struts2文件上传与自定义拦截器

    2021-10-31 12:52:44
  • C#线程定义和使用方法详解

    2022-08-18 00:51:51
  • SpringBoot小程序推送信息的项目实践

    2021-12-07 04:23:34
  • 浅谈Android Studio如何Debug对应so文件C/C++代码

    2023-11-20 03:23:35
  • java实现操作系统中的最佳置换Optimal算法

    2023-10-26 10:27:13
  • Android实现按钮拖拽还原功能

    2023-10-22 18:31:13
  • Go Java算法之累加数示例详解

    2023-03-16 00:43:31
  • SpringBoot使用Kaptcha实现验证码的生成与验证功能

    2022-11-30 15:57:44
  • Android读写文件工具类详解

    2021-10-08 18:08:12
  • Java实现双保险线程的示例代码

    2023-09-21 07:59:46
  • Android UI控件ExpandableListView基本用法详解

    2021-12-26 22:20:50
  • asp之家 软件编程 m.aspxhome.com