问题描述
- 为什么编写c程序时,200*5*0.85等于849????
-
不应该等于850吗???
#include
int main(void)
{
const int danjia = 5;
int shuliang = 0;
int zongjia = 0;
int zan = 0;
printf("shurushuliang:");
scanf("%d",&shuliang);
zan = shuliang * danjia;
if((zan > 30) && (zan <= 50))
zongjia = shuliang*danjia*0.9;
printf("%d",zongjia);
if(zan > 50)
{
zongjia = shuliang*danjia*0.85;
printf("%d",zongjia);
}
else
printf("%d",shuliang*danjia);
return 0;
}
解决方案
这个没办法判断,不同的编译器会使用不同的运算结合次序,以及不同的硬件指令,而进制误差是不可预期的。
最后的去整直接舍去了小数部分,而不是四舍五入。
解决方案二:
我在windows7 + vs2010上运行 是850
解决方案三:
而且,不同的编译器对这种错误的容忍度是不一样的,所以结果会不同
解决方案四:
这完全是因为浮点型计算精度的问题
0.85 在实际参与运算进,可能是 0.8499999999999,而导致结果是 849.
解决方案五:
就是因为你用的int型,而0.85是浮点型,虽然有隐性转换,但是编译器有时还是会出错,最好改成double型
解决方案六:
我这里Android-arm的G++编译器输出的结果是850
怎么做本身就是不规范的,不同的编译器实现可能会不同
解决方案七:
同一个表达式,不同的编译器有不同的结合方式,可能和人算的优先顺序不一致;另外浮点数在内部表示和显示值有一定的误差,最终取整,它取得不是四舍五入,而是直接砍掉小数部分导致。说不出问题在哪,换个编译器,或者结果也用浮点数看看。
解决方案八:
浮点数会产生精度的问题
解决方案九:
你的0.85不是double的嘛,哪里都是int。
解决方案十:
隐式类型转换, 浮点数相关内容参考 IEEE754 标准 ,IEEE754标准百度词条
时间: 2024-09-11 02:18:33