C#使用float类型进行计算的时候出错,难道是精度原因?详情见调试

C_sharp_初学者 2013-08-31 08:18:07
一个本来应该得到205.0的数却得到了204.999985的结果
于是我在调试的时候用几种方法算了一下,结果是这样的
首先说明里面的参数
arraylist对应的那个值为8.2

如果不用(float)会说缺少强制转换

然后YSlice的值是0.4

所以82/0.4的结果应该是20.5

但是*10以后结果本应该是205.0,却成了204.999985

我直接把8.2/0.4的结果拿来*10又没有问题,说明问题出在8.2/0.4*10上

直接/0.4也是不对的,说明不是变量引用的问题

直接*25也没有问题

*10/0.4也出现问题,说明就是这两个一起的时候会有问题

这种情况该怎么解决啊
...全文
951 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2013-09-01
  • 打赏
  • 举报
回复
float 是单精度,应该用双精度的 double,但也只是误差小很多。
stonespace 2013-09-01
  • 打赏
  • 举报
回复
这不是错误,而是误差,float只有6~7位有效数字,所以在小数点后第四位出现误差是完全正常的,如果嫌误差太大,可以用double,
C_sharp_初学者 2013-08-31
  • 打赏
  • 举报
回复
引用 9 楼 soaringbird 的回复:
[quote=引用 6 楼 u011304925 的回复:] [quote=引用 3 楼 rui_china 的回复:] 用decimal
要用来花曲线,DrawLine参数是int和float啊[/quote] 计算过程中用decimal,画线时强转一下即可。decimal的精度比float和double要高,虽然不是绝对安全的,但是基本上能满足你的要求,在你找到如何避免累积误差的解决方案之前。[/quote] 我用double计算,画图的时候强制转换成float就满足需求了 只是现在又有别的问题了,哎 不过是计算方法的问题,自己琢磨吧
soaringbird 2013-08-31
  • 打赏
  • 举报
回复
引用 6 楼 u011304925 的回复:
[quote=引用 3 楼 rui_china 的回复:] 用decimal
要用来花曲线,DrawLine参数是int和float啊[/quote] 计算过程中用decimal,画线时强转一下即可。decimal的精度比float和double要高,虽然不是绝对安全的,但是基本上能满足你的要求,在你找到如何避免累积误差的解决方案之前。
C_sharp_初学者 2013-08-31
  • 打赏
  • 举报
回复
大概几十个数据里就两个出这问题,真蛋疼
C_sharp_初学者 2013-08-31
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
建议你找一本《计算方法》的教科书看看,看第一章的概念就够了。你可以看看假设两个数的误差是a和b,那么他们的加减法的累计误差是多少;假设是除法,那么累计误差又是多少?! float只有7位有效数字,也就是说古老的简易计算器的计算精度。当你多次计算,特别是在除数中使用误差数据,累计误差的增长必然很快。 这个时候,你就应该改变计算公式,使用一个理论上结果一样、但是累计误差最小的公司。
果然是float精度引起的误差么,但是为什么分步算没有问题,写一行里就出问题啊
C_sharp_初学者 2013-08-31
  • 打赏
  • 举报
回复
引用 3 楼 rui_china 的回复:
用decimal
要用来花曲线,DrawLine参数是int和float啊
  • 打赏
  • 举报
回复
建议你找一本《计算方法》的教科书看看,看第一章的概念就够了。你可以看看假设两个数的误差是a和b,那么他们的加减法的累计误差是多少;假设是除法,那么累计误差又是多少?! float只有7位有效数字,也就是说古老的简易计算器的计算精度。当你多次计算,特别是在除数中使用误差数据,累计误差的增长必然很快。 这个时候,你就应该改变计算公式,使用一个理论上结果一样、但是累计误差最小的公司。
C_sharp_初学者 2013-08-31
  • 打赏
  • 举报
回复
引用 1 楼 soaringbird 的回复:
用decimal类型吧
要用来画图,drawline参数里只能用int和float
灬浪子灬 2013-08-31
  • 打赏
  • 举报
回复
用decimal
C_sharp_初学者 2013-08-31
  • 打赏
  • 举报
回复
补充,直接8.2/0.4*10也会出现该问题
这是神马情况~
soaringbird 2013-08-31
  • 打赏
  • 举报
回复
用decimal类型吧

110,545

社区成员

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

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

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