Math.Round出错

baihualin1983 2016-04-07 01:42:27
为什么Math.Round会出现这样的结果?

我怀疑出现这个问题的原因是我调用了c++的库有关,不光是Math.Round函数,很多数据都会出错。如果不调用c++的库就没有这个问题了。

请教出现这个问题的原因,为什么会出现这样的结果,该如何解决?万分感谢!


double d=Math.Round(0.077004402875900269,2);

监控d的结果是:0.079999998211860657

并不是想要的结果,正确的结果应该是保留小数点后的2位

Math.Round(0.553,2) 这句的返回值也不正确,返回很长的一个double类型
...全文
284 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球中国 2016-04-09
  • 打赏
  • 举报
回复
double类型本来就是不确定的。 decimal dvalue=Math.Round((decimal)value,2);
枫0子K 2016-04-08
  • 打赏
  • 举报
回复
我也测试了一下,证明楼主说的这几个数是能得到正确结果的。 我推测可能是引用的C++库中存在了Math.Round这样的函数,导致在调用的时候错误调用了C++库里的这个函数,那他这个函数是干嘛用的就不知道了。 楼主尝试下指明具体的数据类型,就是明确调用方法,如Math.Round(0.553m,2); 不行的话就连命名空间都指明:System.Math.Round(0553m,2); System.Math在mscorlib.dll中, Math.Round(double,int)的源码
public static double Round(double value, int digits)
{
	if (digits < 0 || digits > 15)
	{
		throw new ArgumentOutOfRangeException("digits", Environment.GetResourceString("ArgumentOutOfRange_RoundingDigits"));
	}
	return Math.InternalRound(value, digits, MidpointRounding.ToEven);
}
private unsafe static double InternalRound(double value, int digits, MidpointRounding mode)
{
	if (Math.Abs(value) < Math.doubleRoundLimit)
	{
		double num = Math.roundPower10Double[digits];
		value *= num;
		if (mode == MidpointRounding.AwayFromZero)
		{
			double value2 = Math.SplitFractionDouble(&value);
			if (Math.Abs(value2) >= 0.5)
			{
				value += (double)Math.Sign(value2);
			}
		}
		else
		{
			value = Math.Round(value);
		}
		value /= num;
	}
	return value;
}
baihualin1983 2016-04-08
  • 打赏
  • 举报
回复
示例代码:http://pan.baidu.com/s/1mhPygkC 先点击开始按钮,等待一会后点击button3,请各位大神帮忙看看,万分感谢
hchloveit 2016-04-08
  • 打赏
  • 举报
回复
小数点后面的数太长了吧
baihualin1983 2016-04-08
  • 打赏
  • 举报
回复
您可以下载代码帮忙看下吗:http://pan.baidu.com/s/1mhPygkC 先点开始,然后点button3
baihualin1983 2016-04-07
  • 打赏
  • 举报
回复
谢谢回复,现在不只是这一个问题,好多地方都有问题,比如说数值型的数据给改变了,感觉调用c++后给c#改变了某种东西 比如说没调用c++库时的统计图 调用c++库之后的统计图
Poopaye 2016-04-07
  • 打赏
  • 举报
回复
可以试下: 1、用Round(decimal, int) 2、自己实现Round
baihualin1983 2016-04-07
  • 打赏
  • 举报
回复
c++可以覆盖c#的方法吗?
xuzuning 2016-04-07
  • 打赏
  • 举报
回复
不排除 C++ 覆盖了 Math.Round 的可能性
baihualin1983 2016-04-07
  • 打赏
  • 举报
回复
vs2013,net4.5
baihualin1983 2016-04-07
  • 打赏
  • 举报
回复
如果不调用c++的视频播放库就没问题,要是调用之后就会出现错误的结果,不知道为什么会出现这样的情况
  • 打赏
  • 举报
回复
说下你的Frame版本和VS版本呢 看你数据有没有过转换,理论上讲不会有精度问题
Poopaye 2016-04-07
  • 打赏
  • 举报
回复

110,538

社区成员

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

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

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