double与int类型的比较--分析double的误差

首先我们应该知道double是可以与int类型直接进行比较的(按照等级double>int,因此比较时,int升为double型来比较)
例如

int a=2;
double c=3.0;
if(c>a)//a变为2.0的double
......

下面我们分析double与int的误差分析

我写了如下代码作为探究的作证以便大家分析:(可以不用看分析,直接看结果)

#include<stdio.h>
int main()
{
    double a,c;
    int b;
    a=2/3*3;//这样是转不了double型的
    c=2.0/3*3;
    b=2/3*3;
    printf("a=%lf c=%lf b=%d\n",a,c,b);
}

得到以下结果

a=0.000000 c=2.000000 b=0

当我们在运算中将类型转换为浮点型进行运算时(例如2/33;7/66;7/33结果都与约分结果相同)似乎因为c是浮点型故并不受小数除不尽的限制,运算的结果与约分的化简效果相当——例如2.0/33是先1/3*3=1,然后2/1——仿佛直接化简了。但事实真的如此吗?
我们用double与int型直接比较来探究:
加上如下代码:

if(c==2)printf("ok!");
else printf("error");`

c前面打印结果是2.000000(double)与2(int)比较结果应该是ok
但结果是error,这说明并非像我们想的那样直接化简了,而是最后四舍五了才计算的1.666666*3得出结果并四舍五入得出看似正确的。我们原来打印的c=2.000000并不代表c真实的值。c的值和打印结果是由误差的,那么误差是多少???(无论如何计算,打印出来的值都是约分的值。但是其实际并非这个值,是通不过if判断的!)
经过使用调试我们得到它的值误差在0.0000001上
即在遇到除不尽时我们使用double计算。当其值与得到的表面值误差在0.000001之内时即可当作约分化简。
例如

if(c>=1.999999&&c<=2.000001)printf("ok");
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值