问题
最近在工作最到了一个关于四舍五入的问题是关于四舍五入不一致的问题,通过google详细的查询了一番
1.125 保留两位小数问题
测试环境
office excel 2007
1.125保留两位小数后是1.13
vs2010 C#代码中
double d1 = Math.Round(1.125,2) // 1.12
结果不一样!
分析
Excel中的保留小数方式是我们传统的四舍五入的方式,但C#是的Math.Round默认采用的其实并不是我们传统上的四舍五入的方式
而是四舍六入五成双的方式,可以查看以下链接 http://baike.baidu.com/view/1245064.htm
下面分析一下在C#和sqlserver 中的Round的行为方式:
1. C# 中的Round有带第三个参数的重载方式
MidpointRounding --这是一个枚举类型有两个 ToEven 和AwayFromZero 其中ToEven就是默认的行为
ToEven 当一个数字是其他两个数字的中间值时,会将其舍入为最接近的偶数。 AwayFromZero 当一个数字是其他两个数字的中间值时,会将其舍入为两个值中绝对值较小的值
上个这个解释是MSDN上的,但我觉得第AwayFromZero的中文解决比较难理解,应该按照英文字面的意思理解起来比较容易
即 结果是离0最远的数, 例如: 1.125 得1.13 而不是1.12 1.13比1.12离0更远一些, 负数也是如些
使用AwayFromZero 则行为为excel一致了
2. sqlserver中的Round ,也有第三个参数
ROUND ( numeric_expression,length [,function ] )
但是它的第三个参数和四舍六入五成双没有关系,如果第三个为0则是四舍五入,否则直接是去尾法了。
也是就是说sqlserver中的round并不支持四舍六入五成双这种方式,如果想实现还得自己去实现一个函数
结论
1.sqlserver中的Round默认的行为与excel中是一样的,都是采用的传统我们印象里的四舍五入的方式
2.C#中的Round默认的方式是我们上面说的四舍六入五成双的方式,所以在做统计数据编程的时候可以要小心,程序生成的值可能和客户自己通过excel算出来的不一样
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。