四舍五入 与 四舍六入五成双
今天公司有个同事在调一个asp程序时候,发现 round(1.25,1) 返回的竟然是1.2 而不是1.3
查询了一下CSDN的帖子,发现这竟然是一个Bug:
http://search.csdn.net/expert/topic/51/5101/2002/5/27/756396.htm
经测试。
VBscript, ASP 中 round(1.25,1) 返回的是 1.2
C# 中也是这个问题(.net 相关的语言C# VB.net? Js.net都有这个问题)
???double? aa = 1.25;
???aa = Math.Round(aa,1);
???Response.Write(aa.ToString());
返回的是1.2
SQL 中 select round(1.25,1) 返回的是1.3
?
原因: PC 采用的是 “四舍六入五成双”,而不是 “四舍五入”的方式。
(footballboy(郑创斌) 提供的原因)
他的原因我也贴出来:
回复人: footballboy(郑创斌) 2002-5-30 11:48:13
我以前就发现这个问题,探究了一番.结果如下:
我这样理解,若需要舍入到的位的后面"小于5"或"大于5"的话,按通常意义的四舍五入处理.若"若需要舍入到的位的后面"精确等于5",则舍入后末位为偶数,举例
? MsgBox "round(1.25,1)=" & Round(1.25, 1)
显示结果为1.2,因为1.2之后的尾数"精确等于5",舍入后末位要求是偶数,所以舍入结果是小数1.2而不是大数1.3
? MsgBox "round(1.25001,1)=" & Round(1.25001, 1)
显示结果为1.3,因为1.2之后的尾数"大于5",按四舍五入处理
? MsgBox "round(1.35,1)=" & Round(1.35, 1)
显示结果为1.4,因为1.2之后的尾数"精确等于5",舍入后末位要求是偶数,所以舍入结果是大数1.4而不是小数1.3
同理
? MsgBox "round(1.345,2)=" & Round(1.345, 2)
? MsgBox "round(1.355,2)=" & Round(1.355, 2)
显示结果分别是1.34和1.36
我总结出的舍入规律是"四舍六入五成双",这里"四"是小于五的意思,"六"是大于五的意思,"五"是舍入位之后的尾数"恰等于5".
?
回复人: footballboy(郑创斌) 2002-5-30 12:04:12 得分:100?
?
补充一下,我认为从统计学的角度,"四舍六入五成双"比"四舍五入"要科学,它使舍入后的结果有的变大,有的变小,更平均.而不是像四舍五入那样逢五就入,导致结果偏向大数.
例如:1.15+1.25+1.35+1.45=5.2,若按四舍五入取一位小数计算
1.2+1.3+1.4+1.5=5.4
按"四舍六入五成双"计算,1.2+1.2+1.4+1.4=5.2,舍入后的结果更能反映实际结果
测试了几种语言,发现已经测试的编程都是"四舍六入五成双",而 Sql Server 是简单的"四舍五入"。
----以下内容为转摘后添加
附部分c#测试结果:
1.四舍六入五成双例子
Math.Round(3.44,1) 3.4
Math.Round(3.54,1) 3.5
Math.Round(3.64,1) 3.6
Math.Round(3.45,1) 3.4
Math.Round(3.55,1) 3.6
Math.Round(3.65,1) 3.6
Math.Round(3.46,1) 3.5
Math.Round(3.56,1) 3.6
Math.Round(3.66,1) 3.7
2.用Double.ToString("0.#")方法,实现的好像是传统的“四舍五入”功能?(不是很确认,有知情人请告知)
double aaa =0;
string sss ="";
aaa =3.44; //sss = aaa.ToString("0.#"); return 3.4
aaa =3.54; //sss = aaa.ToString("0.#"); return 3.5
aaa =3.64; //sss = aaa.ToString("0.#"); return 3.6
aaa =3.45; //sss = aaa.ToString("0.#"); return 3.5
aaa =3.55; //sss = aaa.ToString("0.#"); return 3.6
aaa =3.65; //sss = aaa.ToString("0.#"); return 3.7
aaa =3.46; //sss = aaa.ToString("0.#"); return 3.5
aaa =3.56; //sss = aaa.ToString("0.#"); return 3.6
aaa =3.66; //sss = aaa.ToString("0.#"); return 3.7
境VS2005,VS2003没有测试。
Math.Round (Decimal, Int32) |
将小数值舍入到指定精度。 由 .NET Compact Framework 支持。 |
Math.Round (Double, Int32) |
将双精度浮点值舍入到指定精度。 由 .NET Compact Framework 支持。 |
msdn并没有详细的说明清楚,给了一个例子;
Math.Round(3.44, 1); //Returns 3.4. Math.Round(3.45, 1); //Returns 3.4. Math.Round(3.46, 1); //Returns 3.5.
依照他的例子得到的是"五舍六入",我改变了一下数字得到的结果将完全改变。
Math.Round(3.445, 1); //Returns 3.4.
Math.Round(3.455, 1); //Returns 3.5.
Math.Round(3.465, 1); //Returns 3.5.
Math.Round(3.450, 1); //Returns 3.4.(补0是无效的)
Math.Round(3.4452, 2); //Returns 3.45.
Math.Round(3.4552, 2); //Returns 3.46.
Math.Round(3.4652, 2); //Returns 3.47.
非常奇怪当你需要获得小数点后面一位时,第一位参数必需要比你需要的位数多出两位数时才是正常的“四舍五入”,否则将是“五舍六入”,看来只能自已写四舍五入的算法,不能依赖Math.Round,否则我无法知道他何时使用四舍还是五舍,除非你定死你的第一位参数的位数。
2006-08-03 16:27 | .progame [未注册用户]
2006-08-03 17:09 | Rainy
2006-08-03 17:13 | U2U
2006-08-03 17:51 | 自由、创新、研究、探索……
Math.Round()方法使用的银行家算法的依据,是IEEE Standard 754这个国际标准
2006-08-03 18:11 | jijl2001 [未注册用户]
2006-08-03 20:45 | 张三 [未注册用户]
2006-08-03 20:49 | 可爱的书记
2006-08-04 09:20 | 风中的葱
2006-08-04 09:52 | sion [未注册用户]
2006-08-04 10:03 | 心只有你
2006-08-04 11:13 | 星期零
2006-08-04 19:29 | man [未注册用户]
2006-08-06 01:37 | attraction
2006-08-06 11:48 | main
2006-09-01 09:34 | Sam[匿名] [未注册用户]
2006-11-21 19:44 | uu [未注册用户]
2006-11-23 18:28 | YY[匿名] [未注册用户]
2008-04-17 11:20 | hewei-@163.com [未注册用户]
Math.round(-11.5)返回(long)-11;
2008-06-06 15:11 | wyd45123 [未注册用户]
' 3.4 = Math.Round( 3.45, 1)
'-3.4 = Math.Round(-3.45, 1)
'
' 3.4 = Math.Round( 3.45, 1, MidpointRounding.ToEven)
' 3.5 = Math.Round( 3.45, 1, MidpointRounding.AwayFromZero)
'
'-3.4 = Math.Round(-3.45, 1, MidpointRounding.ToEven)
'-3.5 = Math.Round(-3.45, 1, MidpointRounding.AwayFromZero)
2008-08-08 08:59 | akenny0423 [未注册用户]
转载于:https://www.cnblogs.com/Luoke365/archive/2008/08/27/1277735.html
四舍五入 与 四舍六入五成双相关推荐
- C# 四舍五入 (解决四舍六入五成双的问题)
四舍六入五成双是一种精确度的计数保留法.舍入规律是"四舍六入五成双",这里"四"是小于五的意思,"六"是大于五的意思,"五&quo ...
- Java中四舍五入和四舍六入五成双
Math.round()的取整规则结论:四舍五入下取整 例如 A: 11.2 ----> 11 B: 11.6 ----> 12 C: 11.5--->12 D: 11.51-> ...
- php 四舍五入,PHP 四舍五入,不四舍五入,四舍六入五成双(银行家舍入)
1.php保留两位小数并且四舍五入,代码如下: round(123.666666, 2); // 123.67 2.php保留两位小数并且不四舍五入,代码如下: $offset = strpos($n ...
- java 四舍六入五成双_EXCEL实现四舍六入五成双修约规则的方法
中国药典的修约原则是四舍六入五成双(只是中国药典这样,USP.EP都是四舍五入).四舍六入五成双的修约原则为: 1. 被修约的数字小于5时,该数字舍去: 2. 被修约的数字大于5时,则进位: 3. 被 ...
- C语言中的四舍六入五成双 和 四舍五入
%.mf 可以让浮点数保留 m 位小数输出 保留的是精度为 四舍六入五成双 就是 5以下舍弃 5以上进位 而当下一位为5时要讨论: 被化简的小数位后面一位的数字等于5时 要看5前面的数字,若是奇数则进 ...
- “四舍六入五成双规则” 与 C语言如何实现“四舍五入”
1.四舍六入五成双规则 对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是"四舍六入五成双",也即"4舍6入 ...
- 【Python】银行家算法(四舍六入五成双)和使用decimal进行四舍五入处理
在python3中,round(num,n)和'%.nf'%num都是使用银行家算法进行小数位的处理的,即四舍六入五成双.(python2不记得了) 四舍六入五成双介绍 和四舍五入不同的是,对于最大小 ...
- sqlserver varchar 对于 sum 运算符无效_在sqlserver上实现自定义函数四舍六入五成双...
做过统计都知道关于保留几位小数有好几种方法,其中4舍6入5凑偶用的比较多,所以我就是sqlserver里面实现了一个自定义函数 定义 对于位数很多的近似数,当位数确定后,其后面多余的数字应该舍去,只保 ...
- IEEE浮点数尾数向偶舍入-四舍六入五成双
IEEE浮点数舍入默认算法 可以用一句话来概括 四舍六入五成双 例如有效数字超出规定数位的多余数字是1001,它大于超出规定最低位的一半(即0.5),故最低位进1.如果多余数字是0111,它小于最低位 ...
最新文章
- suse mysql 5.5_suse 11 mysql 如何从5.1升级到5.5
- ELF Format 笔记(十三)—— 段权限
- 【企业管理】整理和思考-陈春花:2022年经营关键词
- php7安装kafka扩展(已经测试)
- c#自定义Json类
- php str_replace多个参数,php str_replace()函数的用法,有那些参数?
- Web 前沿——HTML5 Form Data 对象的使用(转)
- Java多线程中Sleep与Wait的区别
- 字节大牛教你手撕Java学习,神操作!
- x86汇编语言复习笔记
- 自己动手做个智能小车(2)
- 洛谷P1878 舞蹈课 贪心 堆
- 一体机(广告投放机)开发
- 判断星期的方法(已知1900年1月1日是星期一)
- 程序员必备的6个好习惯,成为更优秀的自己
- Groundhog Looking Dowdy(尺取大法)
- 【CSP201609-3】炉石传说【模拟】
- 移动电源大家都买多大的?大容量移动电源推荐
- 概率论-分布函数(高斯分布、复高斯分布、瑞丽分布、Nakagami-m分布、均匀分布、卡方分布)
- 正则环视 php,正则高级环视
热门文章
- jquery的$.ajax()利用FormData数据类型与php后台交互
- Android和iOS 测试五个最好的开源自动化工具
- C++ 模板级实现单链表
- 工业生产中废酸回收技术的原理分析
- PHP 跨域header处理
- 介绍嘉宾的顺序左右之分_液压系统顺序阀工作原理、功用、性能及其应用
- Java后台参数校验
- DSP 程序烧录到flash启动程序死机解决方法(通用)(ADC无法初始化)(在RAM中可行)
- html大马源码,php大马源码:【百家号】脸书百科,分析 PHP大马-php_mof SHELL Web程序...
- glBufferSubData简介