c# 判断语句,double 精度问题

doubleaa=0.09;doublebb=0.11;doublecc=0.02;if(bb-aa==cc){Console.WriteLine("cha{0}:","... double aa = 0.09;
double bb = 0.11;
double cc = 0.02;
if (bb - aa == cc)
{
Console.WriteLine("cha{0}:", "1111");

}

这句为什么返回的是 假,
如何解决呢?
那我把上面的 double 类型 换成了,decimal为什么就好了呢?
这又是为什么呢?

我的意思就是 bb-aa的值 要“小于等于” cc 可是等于的时候条件语句为假不执行了,所以我觉得【davidrin】的方法不好用。

【h123a】的方法我觉得很好,但是也有一个问题,我举例子的小数是只有两位,如果换成更多位数的话怎么半呢?bb aa 是由两个整数相除得到的。

decimal aa = 0.09;
decimal bb = 0.11;
decimal cc = 0.02;
if (bb - aa == cc)
{
Console.WriteLine("cha{0}:", "1111");

}
展开
 我来答
davidrin
2010-04-08 · TA获得超过1789个赞
知道小有建树答主
回答量:718
采纳率:100%
帮助的人:816万
展开全部
浮点运算总是存在精度问题,bb-aa-cc 的实际结果可能不是0而是一个非常小的数,例如-3E-17什么的。因此直接比较常常出现精度造成的困扰,一般不采取此方式,最好是用类似下面的方式来替代:

if( fabs(bb-aa-cc)<=某个合理的小数值 )
百度网友02a064f
2010-04-08 · TA获得超过233个赞
知道小有建树答主
回答量:228
采纳率:0%
帮助的人:157万
展开全部
double aa = 0.09;
double bb = 0.11;
double cc = 0.02;
if (bb*100 - aa*100 == cc*100)
{
Console.WriteLine("cha{0}:", "1111");

}
用乘以10的几次方的方法,把小数都变成整数,然后在判断。
这是因为计算机是2进制的关系,所以小数总是存在着精度问题,这时可以把小数都变成整数,然后再判断。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6eed2f8
2010-04-08 · TA获得超过5082个赞
知道大有可为答主
回答量:3423
采纳率:0%
帮助的人:3820万
展开全部
不要用非整数进行等价判断,因为计算机无法准确的处理小数
可以把double*100 然后转换为整数判断
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
叢林守護者
2010-04-18 · TA获得超过190个赞
知道小有建树答主
回答量:133
采纳率:0%
帮助的人:0
展开全部
我在.NET4下测试,如果是输出bb-aa和cc都是0.02,就是在if比较时候就有问题了...

扩大10n倍数,我认为不是什么明智之举。

我认为可以ToString比较,可以将一个double直接变成一个字符串
如: double x=3.14159000 // 3.14159,而不是3.14159000
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
春来杨柳绿荫多1
2010-04-13 · TA获得超过263个赞
知道答主
回答量:373
采纳率:100%
帮助的人:165万
展开全部
如果你觉得【h123a】的方法好 又担心多位小数的话
你可以不乘100 小数点有几位你就乘1后面有几个0
用indexof(".") 来取小数点后有几位
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式