惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Attack and Defense Labs
Attack and Defense Labs
The GitHub Blog
The GitHub Blog
C
Check Point Blog
博客园_首页
MongoDB | Blog
MongoDB | Blog
N
Netflix TechBlog - Medium
F
Full Disclosure
Microsoft Security Blog
Microsoft Security Blog
爱范儿
爱范儿
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
G
GRAHAM CLULEY
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Threat Research - Cisco Blogs
C
Cybersecurity and Infrastructure Security Agency CISA
V
Vulnerabilities – Threatpost
K
Kaspersky official blog
博客园 - 司徒正美
S
Schneier on Security
T
The Exploit Database - CXSecurity.com
Project Zero
Project Zero
云风的 BLOG
云风的 BLOG
Cisco Talos Blog
Cisco Talos Blog
Know Your Adversary
Know Your Adversary
雷峰网
雷峰网
V
V2EX - 技术
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Spread Privacy
Spread Privacy
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
Security Affairs
SecWiki News
SecWiki News
Schneier on Security
Schneier on Security
O
OpenAI News
Jina AI
Jina AI
PCI Perspectives
PCI Perspectives
Cyberwarzone
Cyberwarzone
Y
Y Combinator Blog
Apple Machine Learning Research
Apple Machine Learning Research
B
Blog RSS Feed
I
InfoQ
D
Docker
P
Palo Alto Networks Blog
Recorded Future
Recorded Future
M
MIT News - Artificial intelligence
博客园 - Franky
B
Blog
Scott Helme
Scott Helme
博客园 - 叶小钗
D
DataBreaches.Net

博客园 - 洛客

IOS SDK 兼容性 研究 中国地址的英文翻译 重构的概念 - 洛客 - 博客园 WCF RIA Services DomainService life-cycle and adding Transactions Silverlight 3 RIA服务编程中使用自定义方法及服务操作 HP大中华区总裁孙振耀退休感言 C#泛型 Session莫名丢失的原因及解决办法 在SQL Server 2005中实现 Server.UrlEncode、Server.UrlDecode 商品條碼 让包装纸箱增加网店服务的附加值 男人30岁需要完成的事! 結婚照 我要结婚了 C#中如何实现对象拷贝 网站优化——静态页面和动态页面的区别 网站优化—百度和google的一些优化特点 汕頭地方方言 Speed Up Your Site with the Improved View State in ASP.NET 2.0
四舍五入 与 四舍六入五成双
洛客 · 2008-08-27 · via 博客园 - 洛客

今天公司有个同事在调一个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 [未注册用户]

世界上的许多国家已广泛采用“四舍六入法”。我国国家科委于1955年就作了推荐。“四舍 六入法”可以概括为:“四舍六入五考虑,五后非零就进一,五后皆零看奇偶,五前为偶应舍 去,五前为奇要进一。”

在工程技术、金融和科学领域,我们往往认为将一个小数圆整到距离它最近的偶数(而并非总是将它向上圆整)更加精确,即我们在此所说的“四舍六入”法。
Math.Round()方法使用的银行家算法的依据,是IEEE Standard 754这个国际标准

这个都不知道,四舍六入五成双,Round都是这样处理的。

我也遇到过这个问题,起初也很奇怪,后来看了帮助,果然是四舍六入五靠偶,虽然楼上的所说的四舍六入是国际标准,但是中国的很多业务系统还是采取的是四舍五入的方法,没办法,我只好自己写了个方法来四舍五入了。不过网上有一个不错的方法,虽然有取巧嫌疑,但是一般没什么问题,就是在后面加上0.0000000001,很小的一个数,这时再来取两位,三位或四位就基本没问题了。可以试试

俺也是今天才发现“四舍、六入、五凑偶”,感谢有心的楼主

Math.round(11.5)返回(long)12,
Math.round(-11.5)返回(long)-11;

这个函数的正确用法:
' 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)

我是搞工程施工的,我们的数据处理一直就是“四舍六入,5凑偶”,但如果5前为偶数,但5后还有非零数,则还要进位。