C#编程实现四舍五入、向上及下取整的方法

 更新时间:2015年11月17日 15:32:55   作者:碧水寒潭  
这篇文章主要介绍了C#编程实现四舍五入、向上及下取整的方法,涉及C#数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C#编程实现四舍五入、向上及下取整的方法。分享给大家供大家参考,具体如下:

在处理一些数据时,我们希望能用“四舍五入”法实现,但是C#采用的是“四舍六入五成双”的方法,如下面的例子,就是用“四舍六入五成双”得到的结果:

double d1 = Math.Round(1.25, 1);//1.2
double d2 = Math.Round(1.24, 1);//1.2
double d3 = Math.Round(1.26, 1);//1.3
double d4 = Math.Round(1.35, 1);//1.4

为了用C#来实现“四舍五入”,我写了下面的函数:

代码

/// <summary>
/// 实现数据的四舍五入法
/// </summary>
/// <param name="v">要进行处理的数据</param>
/// <param name="x">保留的小数位数</param>
/// <returns>四舍五入后的结果</returns>
private double Round(double v, int x)
{
  bool isNegative = false;
  //如果是负数
  if (v < 0)
  {
   isNegative = true;
   v = -v;
  }
  int IValue = 1;
  for (int i = 1; i <= x; i++)
  {
   IValue = IValue * 10;
  }
  double Int = Math.Round(v * IValue + 0.5, 0);
  v = Int / IValue;
  if (isNegative)
  {
   v = -v;
  }
  return v;
}

经过简单的测试,上面的函数能实现对数据的四舍五入法。

Math.Round ()在四舍五入时有个问题: 

Math.Round(2.5,0) = 2; 
Math.Round(3.5,0) = 4;

2.5应该等于3才对!

在ASP中也存在这个问题,不过ASP中还有个FormatNumber可以用,但目前还不知道怎么使用?

解释:

Math.Round()准确的说,这个函数不是四舍五入,而是四舍六入五凑偶,就是说小于4或大于6的该舍该入是没有争议的,而5处在正中间,如果四舍五入则会造成数据的整体偏差,所以采取的原则是:如果舍入位为5,则舍入后最后一位为偶数,这是国际惯例。

现在做的项目都要5入,解决方法:

目前做法是:

如:(3.45*10+0.5)取整,再除以10

C# 中没有四舍五入函数,事实上我知道的程序语言都没有四舍五入函数,因为四舍五入算法不科学,国际通行的是 Banker 舍入法 Banker 's 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 枚举

此枚举有两个成员:

AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较大的值。

ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。

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

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

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

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

double ChinaRound(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); 
 } 
} 

有些时候不一定要用四舍五入的,可能需要上取整或下取整:

Math.Ceiling()和Math.Floor

Math.Ceiling(3.1)=4; 
Math.Floor(3.9)=3;

取天板值与地板值,与"四舍五入"无关。其实Floor的结果与(int)相同,因此也可以这样写Math.Floor((double)2/3+0.5)

floor 和 ceil是math unit 里的函数,使用前要先 Uses Math。

trunc 和 round 是system unit 里的函数,缺省就可以用。

floor 直接往小的取,比如 floor(-123.55)=-124,floor(123.55)=123

trunc 直接切下整数,比如 trunc(-123.55)=-123, floor(123.55)=123

ceil 直接往大的取,比如 ceil(-123.55)=-123, ceil(123.55)=124

round 计算四舍五入,比如 round(-123.55)=-124,round(123.55)=124

C#取整函数向上取整实例

int a = 5; 
int b = 2; 
lbl.Text = Convert.ToString(Math.Ceiling((double)a / (double)b)); 

希望本文所述对大家C#程序设计有所帮助。

相关文章

  • C#使用CEFSharp获取动态网页源码的演示步骤

    C#使用CEFSharp获取动态网页源码的演示步骤

    CEFSharp是一个用C#编写的库,它是Chromium Embedded Framework (CEF) 的.NET封装和扩展,CEF允许开发者在自己的应用程序中嵌入一个功能强大的HTML渲染引擎,从而能够呈现网页内容,本文介绍了C#如何使用CEFSharp获取动态网页源码,需要的朋友可以参考下
    2024-08-08
  • WPF使用Geometry绘制几何图形

    WPF使用Geometry绘制几何图形

    这篇文章介绍了WPF使用Geometry绘制几何图形的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 解析abstract与override究竟可不可以同时使用

    解析abstract与override究竟可不可以同时使用

    本篇文章是对abstract与override究竟可不可以同时使用进行了详细分析介绍,需要的朋友参考下
    2013-05-05
  • C#中GridView动态添加列的实现方法

    C#中GridView动态添加列的实现方法

    这篇文章主要介绍了C#中GridView动态添加列的实现方法,涉及C#中GridView的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C#简单读写txt文件的方法

    C#简单读写txt文件的方法

    这篇文章主要介绍了C#简单读写txt文件的方法,涉及C#针对文件的基本打开、写入、保存与读取等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • C#使用密封类实现密封用户信息的示例详解

    C#使用密封类实现密封用户信息的示例详解

    在C#中,密封类(sealed class)是一种不能被其他类继承的类,它用于防止其他类继承它的功能和属性, 下面我们就来看看如何使用密封类密封用户的信息吧
    2024-02-02
  • C#中循环语句:while、for、foreach的使用

    C#中循环语句:while、for、foreach的使用

    本篇文章主要介绍了C#中的三种循环语句(while、for、foreach)的实现方式,需要的朋友可以参考下
    2015-07-07
  • Winform中GridView分组排序功能实现方法

    Winform中GridView分组排序功能实现方法

    这篇文章主要介绍了Winform中GridView分组排序功能实现方法,以实例形式详细说明了分组排序的实现方法,并附带完整的DBHelp类代码,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • c#中executereader执行查询示例分享

    c#中executereader执行查询示例分享

    这篇文章主要介绍了c#中executereader执行查询示例,需要的朋友可以参考下
    2014-04-04
  • 详解C#中有趣的 SourceGenerator生成器

    详解C#中有趣的 SourceGenerator生成器

    源生成器是Roslyn编译器的一个强大特性,允许开发者在编译阶段注入自定义代码,本文通过一个实例探究源生成器的使用方法及其在AOT场景的应用,并利用WinDbg工具深入分析Roslyn的内部机制
    2024-10-10

最新评论