#include
#define int long long
signed main(){
double n;
int a;
scanf("%lf",&n);
a=(n-(int)n)*10;
printf("%lld",a);
return 0;
}
浮点数误差造成的,虽然输入的是236654.8,但实际可能是236654.79999998这样子
你将小数部分乘以10 以后是7.9999998,然后取整是进行截尾处理,小数部分全部丢失,因此可能会是7
建议修改如下:
a=(n-(int)n+0.5)*10;
这确保四舍五入
如果只想解决误差问题,改为
a=(n-(int)n+0.000001)*10;
在遇到float 和 double 类型的变量时,你需要知道一点就够了,它们不是精确值,而是近似值。
例如,你这里double n ,虽然你输入的是236654.8,当该值进入内存中时,就不一定是236654.8 了,而可能是236654.7993939393类似的。
那,按照你的程序,是取小数点后的第一位,就有可能是7 了。
如果有其他问题,欢迎随时交流~~~
如果回答对你有帮助,希望能得到你的采纳~~~~
你可以打印n-(int)n的值来看
它的值是0.799999999988358
浮点误差造成的
你可以先使用round函数让它四舍五入保留小数点后2位再进行计算
也可以定义为decimal类型
要取得正确的数据位的数据,针对这个数据,可先把输入的数据*10,然后取整数的个位数即可(可sprintf到字符数组里)。
你可能理解错了!只要在精度范围内都是可以精确表示的。并不存在0.8会变成0.79999...的情况,除非在计算过程中被隐式转换或显式转化不恰当导致精度丢失。
仅供参考!谢谢!
浮点型转成整型输出必然会丢失精度!
要精确输出当然也可以了,
用浮点数形式输出,输出格式用%.0lf形式,截掉小数点以及后面的数。
#include<stdio.h>
//#define int long long
signed main()
{
double n;
double a;
printf("原始数据值:");
scanf("%lf", &n);
printf("原数据在内存中的值也是:%lf\n",n);
a = (n - (int)n) * 10;
printf("小数部分实际存储在内存中的值是:%lf\n",a);
printf("截掉小数部分后:%.0lf\n",a);
return 0;
}