这个四舍五入的问题也太怪了吧?

SeameNow 2010-01-25 06:16:46
虽然我在网上也搜索到有关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
按照银行家舍入法也应该有一个会进位

我实在搞不明白
...全文
203 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
SeameNow 2010-01-27
  • 打赏
  • 举报
回复
5楼 6楼说的应该没错,虽然我还没来及测试。。。

可能怪我没说清楚, SQL77 说的似乎不是 C# 的函数。。。。
ychw365 2010-01-26
  • 打赏
  • 举报
回复
新手路过 有点不明白
aboluoyuren 2010-01-26
  • 打赏
  • 举报
回复
赞一下
CZLJ2008 2010-01-26
  • 打赏
  • 举报
回复
使用Math.Round()函数时,程序提示的数据类型为decimal,即浮点型数据;所以在使用此函数前首先定义一个decimal 类型变量,在使用是不会出现你的上述问题的。Math.Round()函数就是实现一个奇进偶不进的功能。如:Math.Round(2.355,2)=2.36;Math.Round(2.345,2)=2.34;
ILOVE_ASPNET 2010-01-26
  • 打赏
  • 举报
回复
LZ 正解, 帮顶,接分。。
Taiyangchen 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sql77 的回复:]
ROUND
返回数字表达式并四舍五入为指定的长度或精度。

语法
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。

[/Quote]

回答的很好!
风骑士之怒 2010-01-26
  • 打赏
  • 举报
回复
mark
mxc1225 2010-01-26
  • 打赏
  • 举报
回复
dapsxianfeng2010 2010-01-26
  • 打赏
  • 举报
回复
你用错方法了,应该用带midpointrounding那个参数的方法而不是int32的那个
mohugomohu 2010-01-26
  • 打赏
  • 举报
回复
C#里面是五舍六入
2213.576
3911.426
试试看
xxpp688 2010-01-26
  • 打赏
  • 举报
回复
你的写法有问题
正确语法:
ROUND ( numeric_expression , length [ , function ] )
cnzdgs 2010-01-26
  • 打赏
  • 举报
回复
写错了一句,应该是“十进制小数多数情况不能精确地用二进制有限小数表示”。
cnzdgs 2010-01-26
  • 打赏
  • 举报
回复
double型数据在计算机中是以二进制来储存的,十进制有限小数多数情况不能精确地用二进制小数表示。对于5.425、6.425、7.425,用double型数据表示比实际数值要略小一点,所以结果是.42;对于8.425、9.425,用double型数据表示比实际数值要略大一点,所以结果是.43。
改成用decimal就不会有这种问题了。
wangminqi 2010-01-25
  • 打赏
  • 举报
回复
你把数据类型转换为decimal类型就正确了
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
SQL77 2010-01-25
  • 打赏
  • 举报
回复
SELECT Round(5.425,2,0) 
SELECT Round(5.425,2,1)

------
5.430

(所影响的行数为 1 行)


------
5.420

(所影响的行数为 1 行)


SQL里面的解释
SQL77 2010-01-25
  • 打赏
  • 举报
回复
ROUND
返回数字表达式并四舍五入为指定的长度或精度。

语法
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。
SQL77 2010-01-25
  • 打赏
  • 举报
回复
Round

函数就是这个意思,截取几位,
卧_槽 2010-01-25
  • 打赏
  • 举报
回复
诶,Round支持银行家算法。不过好像貌似有个参数。你用错方法了。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧