为什么编写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;
}

这完全是因为浮点型计算精度的问题
0.85 在实际参与运算进,可能是 0.8499999999999,而导致结果是 849.

我在windows7 + vs2010上运行 是850图片说明

就是因为你用的int型,而0.85是浮点型,虽然有隐性转换,但是编译器有时还是会出错,最好改成double型

而且,不同的编译器对这种错误的容忍度是不一样的,所以结果会不同

这个没办法判断,不同的编译器会使用不同的运算结合次序,以及不同的硬件指令,而进制误差是不可预期的。
最后的去整直接舍去了小数部分,而不是四舍五入。

我这里Android-arm的G++编译器输出的结果是850
怎么做本身就是不规范的,不同的编译器实现可能会不同

同一个表达式,不同的编译器有不同的结合方式,可能和人算的优先顺序不一致;另外浮点数在内部表示和显示值有一定的误差,最终取整,它取得不是四舍五入,而是直接砍掉小数部分导致。说不出问题在哪,换个编译器,或者结果也用浮点数看看。

浮点数会产生精度的问题

你的0.85不是double的嘛,哪里都是int。

隐式类型转换, 浮点数相关内容参考 IEEE754 标准 ,IEEE754标准百度词条

浮点数精确度的问题. 如果感兴趣你可以看看计算机组成原理中的进制转换, 里面详细说明了这种情况.