将数字分解如2.76,分解成2 和 76 输出,为什么有误
- C/C++ code
//编写一个程序,从键盘读入5个值,将他们存储到一个float类型的数组amounts中//创建两个包含5个long元素的数组dollars和cents//将amounts数组元素的整数部分存储到dollars的对应元素中//amounts的数组元素的小数部分存储到cents中,只保存两位数字//例如 amonunts[1]是2.75,则把2保存到dorrlars【1】,把75存储到cents[1],//以货币格式输入这2个long类型数组的值如 $2.75#include <stdio.h>#include <math.h>int main(void){ float amounts[5]; long int dollars[5]; long int cents[5]; for(int i=0;i<5;i++) { printf("please input no.%d:",i+1); scanf("%f",&amounts[i]); //printf("%f\t",amounts[i]); dollars[i]=(long int)floor(amounts[i]); //printf("%ld",dollars[i]); cents[i]=(long int)100*(amounts[i]-floor(amounts[i])); // printf("%ld\n",cents[i]); printf("$%f\tis %ld\t dollars and %ld cents\n",amounts[i],dollars[i],cents[i]); } return 0;}输出结果
================
please input no.1:2.36
$2.360000 is 2 dollars and 35 cents
please input no.2:2.34
$2.340000 is 2 dollars and 33 cents
please input no.3:2.97
$2.970000 is 2 dollars and 97 cents
please input no.4:8.26
$8.260000 is 8 dollars and 26 cents
please input no.5:7.45
$7.450000 is 7 dollars and 44 cents
Press any key to continue
=======================
为什么输入2.36 却得到 2 和 35
[解决办法]
编译器有误差,精确度有误差,改下这行代码就好了(0.00001在误差范围内)
- C/C++ code
cents[i]=(long int)100*(amounts[i]-floor(amounts[i])+0.00001);
[解决办法]
浮点误差,2.36有可能是2.359999转整形的时候要加上一个很小的数如0.0000001消除误差
[解决办法]
我在vs2005中测试了你的程序,跟踪了一下floor
发现你输入的2.36,在到floor函数中时,显示的是2.3599999这就是出现35的原因了...
在scanf输入时,就错了
[解决办法]
http://topic.csdn.net/u/20100526/22/4eb79931-79d7-4068-85ce-b36012434133.html
float改double就好
scanf_s("%lf",&amounts[i]);改称%lf就对了