double 精度的问题。0.99999

wu38607 2016-05-07 07:00:20
如下代码:
double a=179.807;
double b=2.283;
double c=a+b;

c的结果竟然为182.0899999999997.
正确结果应该是182.09.

为什么会有这个问题呢?请问该怎么解决。
...全文
1351 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2016-05-08
  • 打赏
  • 举报
回复
double,float类型参与运算后,不可以比较大小,有精度损失 要必须比较,要根据你的业务要求,看允许多大误差,是否相等,跟你的业务需要有关,例如系统允许e的-15次方的误差,就用 if(Math.ABS(c-182.09)<Math.Pow(Math.E,-15)) { //认为相等 } else { //认为不相等 }
threenewbee 2016-05-07
  • 打赏
  • 举报
回复
double有表示精度误差和二进制转换精度误差。
wu38607 2016-05-07
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
换句话说吧,你的老师应该教过你,如果要比较两个 double 变量是否相等,应该这样写
if( Math.Abs(a- b)< double.Epsilon)
{

}
是不是?
好的,谢谢老师。
  • 打赏
  • 举报
回复
改一下
if( Math.Abs(a- b)< 1e-10)
{
 
}
不是 Epsilon。
  • 打赏
  • 举报
回复
换句话说吧,你的老师应该教过你,如果要比较两个 double 变量是否相等,应该这样写
if( Math.Abs(a- b)< double.Epsilon)
{

}
是不是?
  • 打赏
  • 举报
回复
double只能保证10位(10进制)数字是准确的,在第11位(十进制)数据上有误差,这是完全正常的。计算机不管是多少几(二进制)位的机器,总之是有限数据宽度的,在运算中必然产生舍入误差。当你进行乘除法的时候,误差数值肯定比加减法更快地扩大。 所以 182.0899999999997 跟 182.09 相等。

111,129

社区成员

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

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

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