在没有制作分数类的情况下,C ++中是否有任何方法可以修复错误的结果,例如0.1-0.06-0.04=6.9388e-18
或0.8-0.6-0.2=5.5511151e-17
(http://ideone.com/ZYx1PB)?
我的意思是:
double val=.1-.06-.04;
unsigned long long hv=*(unsigned long long*)&val;
if((hv&0xFF0FFFFFFFFFFFFF)==0x3C00000000000000ULL)
val=0;
但是当数字像2 ^ -48时,这当然会出错。
答案 0 :(得分:4)
0.1-0.06-0.04
中的减法没有错。两者都是准确的:
$ cat t.c
#include <stdio.h>
main(){
printf("%.60f\n", 0.10);
printf("%.60f\n", 0.06);
printf("%.60f\n\n", 0.04);
printf("%.60f\n", 0.1-0.06-0.04);
}
$ gcc t.c && ./a.out
0.100000000000000005551115123125782702118158340454101562500000
0.059999999999999997779553950749686919152736663818359375000000
0.040000000000000000832667268468867405317723751068115234375000
0.000000000000000006938893903907228377647697925567626953125000
你的程序出了什么问题,你写0.06
认为这个数字是6/100。二进制浮点不能以这种方式工作。没有6/100的确切表示。减法有时也是近似值,但在您的示例中不是。