虽然我在网上也搜索到有关Round是使用 银行家舍入法
四舍六入五取双但是我遇到的这个数字也太怪了吧Math.Round(5.425, 2)
5.42
Math.Round(6.425, 2)
6.42
Math.Round(7.425, 2)
7.42
Math.Round(8.425, 2)
8.43
Math.Round(9.425, 2)
9.43同样的小数位,前面整数位不同就得到的结果不同
其实原来的问题是:我有一笔数:6125.00,正好拆成下面两个数字
2213.575
3911.425结果对他们俩做Math.Round,得到的结果居然是
2213.57
3911.42加起来比原数少了0.01
按照银行家舍入法也应该有一个会进位我实在搞不明白
四舍六入五取双但是我遇到的这个数字也太怪了吧Math.Round(5.425, 2)
5.42
Math.Round(6.425, 2)
6.42
Math.Round(7.425, 2)
7.42
Math.Round(8.425, 2)
8.43
Math.Round(9.425, 2)
9.43同样的小数位,前面整数位不同就得到的结果不同
其实原来的问题是:我有一笔数:6125.00,正好拆成下面两个数字
2213.575
3911.425结果对他们俩做Math.Round,得到的结果居然是
2213.57
3911.42加起来比原数少了0.01
按照银行家舍入法也应该有一个会进位我实在搞不明白
返回数字表达式并四舍五入为指定的长度或精度。语法
ROUND ( numeric_expression , length [ , function ] ) 参数
numeric_expression精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。length是 numeric_expression 将要四舍五入的精度。length 必须是 tinyint、smallint 或int。当 length 为正数时,numeric_expression 四舍五入为 length 所指定的小数位数。当 length 为负数时,numeric_expression 则按 length 所指定的在小数点的左边四舍五入。function是要执行的操作类型。function 必须是 tinyint、smallint 或 int。如果省略 function 或 function 的值为 0(默认),numeric_expression 将四舍五入。当指定 0 以外的值时,将截断 numeric_expression。
SELECT Round(5.425,2,1)
------
5.430(所影响的行数为 1 行)
------
5.420(所影响的行数为 1 行)SQL里面的解释
this.Text = Math.Round(2213.575M ,2 ).ToString()+" "+ Math.Round(3911.425M, 2).ToString();
这是因为double类型2213.575在计算机上存储为2213.5750000000000000000000000000000000000000000001
而3911.425为3911.424999999999999999999999999999999999999999
而decimal就会得到正确的,msdn上解释如下
decimal 关键字表示 128 位数据类型。同浮点型相比,decimal 类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。
http://www.mybuffet.cn
改成用decimal就不会有这种问题了。
正确语法:
ROUND ( numeric_expression , length [ , function ] )
http://topic.csdn.net/u/20100120/09/65df734a-05cb-441a-b740-45cb3dfb7f8c.html