关闭

浮点数精度问题处理

标签: 数据
570人阅读 评论(0) 收藏 举报
分类:

参考

由于浮点数在计算机中的存储问题,所以不论是float类型的数据还是double类型的数据都是有其精度的,取浮点数精度下限,float为6位,double为14位,因此在判断浮点数是否相等时,可引入一个远超过浮点数精度的极小量eps(epsilon)作为判断标准用以判定两浮点数是否相等。
eps缩写自epsilon,表示一个小量,但这个小量又要确保远大于浮点运算结果的不确定量。eps最常见的取值是1e-8左右。
判别浮点数a,b是否相等的写法:fabs(a-b) < eps

此外,对于某些问题的数据我们可以进行一下预处理,使其变为整型数,整型数不存在精度的问题,所以可以直接判断,如:

/*

这个你肯定知道,人民币有以下金额的纸币和硬币:100, 50, 20, 10, 5, 1, 0,5, 0.1, 0.05, 0.02, 0.01。
输入一个金额(保证合法),输出一个整数,是输入金额最少所需的钱币数目(含纸币和硬币)
样例输入
82039.52
样例输出
829

注释(这个不是输出的内容):829是820张100元,1张20元,1张10元,1张5元,4张1元,1张5角,1张2分计算出来的。
*/

/*
由题意知,输入的数都是保留到小数点后两位。
*/

#include <iostream>
#include <cstdio>
#define EPS 1e-6
using namespace std;

const int money[12] = {10000,5000,2000,1000, 500, 100, 50, 10, 5, 2, 1};

int main(){
    //for(int i=0;i<11;i++) cout << money[i] << " ";
    double m;
    while(scanf("%lf",&m)!=EOF){
        int n = (m +EPS) * 100;//浮点数精度处理
        int cnt = 0, t;
        for(int i=0;i<11;i++){
            t = n / money[i];
            cnt += t;
            n -= t*money[i];
        }
        cout << cnt << endl;
    }
    return 0;
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34621次
    • 积分:1057
    • 等级:
    • 排名:千里之外
    • 原创:67篇
    • 转载:3篇
    • 译文:2篇
    • 评论:8条
    文章分类
    最新评论