一场Math.Round函数的误解
有不少人误将Math.Round函数当作四舍五入函数在处理, 结果往往不正确, 实际上Math.Round采用的是国际通行的是 Banker 舍入法.
Banker's rounding(银行家舍入)算法,即四舍六入五取偶。事实上这也是 IEEE 规定的舍入标准。因此所有符合 IEEE 标准的语言都应该是采用这一算法的. 这个算法可以概括为:“四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一。”
请看下面的例子:
Math.Round(3.44, 1); //Returns 3.4. 四舍
Math.Round(3.451, 1); //Returns 3.5 五后非零就进一
Math.Round(3.45, 1); //Returns 3.4. 五后皆零看奇偶, 五前为偶应舍 去
Math.Round(3.75, 1); //Returns 3.8 五后皆零看奇偶,五前为奇要进一
Math.Round(3.46, 1); //Returns 3.5. 六入
如果要实现我们传统的四舍五入的功能,一种比较简单,投机的方法就是在数的后面加上0.0000000001,很小的一个数.因为"五后非零就进一", 所以可以保证5一定进一.
当然也可以自己写函数, 下面给出一段代码:
public static decimal UNIT = 0.0.1m
static public decimal Round(decimal d)
{
return Round(d,UNIT)
}
static public decimal Round(decimal d,decimal unit)
{
decimal rm = d % unit;
decimal result = d-rm;
if( rm >= unit /2)
{
result += unit;
}
return result ;
}
最新文章
- 常用网络工具 ipconfig arp traceroute
- java中采用dom4j解析xml文件
- 使用spring boot+mybatis+mysql 构建RESTful Service
- iOS小技巧 - 和屏幕等宽的Table分割线
- js中&;&; 和 ||
- ZUFE OJ 2301 GW I (3)
- Oracle数据库用户权限和管理员权限
- iOS多线程开发之GCD(中篇)
- Erlang调度器细节探析
- 68.jq---tab选项实现网页定点切换
- Mac NPM 配置
- 描述linux下文件删除的原理
- SpringMvc 文件下载 详解
- English trip V1 - B 13. Are you a model? 你是模特吗? Teacher:Patrick Key: 单词回顾、词性后缀
- maven中 install的install:install的区别
- mongodb postgresql mysql jsonb对比
- linux 的常用命令---------第四阶段
- SpringBoot(三)-- 整合FreeMarker模板
- magento导航栏中如何加入home主页
- NetCore+Dapper WebApi架构搭建(三):添加实体和仓储