最近在工作最到了一个关于四舍五入的问题是关于四舍五入不一致的问题,通过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算出来的不一样 总结
以上是内存溢出为你收集整理的浅谈四舍五入全部内容,希望文章能够帮你解决浅谈四舍五入所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)