浮点数精度问题处理
2015-11-21 11:18
253 查看
参考
由于浮点数在计算机中的存储问题,所以不论是float类型的数据还是double类型的数据都是有其精度的,取浮点数精度下限,float为6位,double为14位,因此在判断浮点数是否相等时,可引入一个远超过浮点数精度的极小量eps(epsilon)作为判断标准用以判定两浮点数是否相等。
eps缩写自epsilon,表示一个小量,但这个小量又要确保远大于浮点运算结果的不确定量。eps最常见的取值是1e-8左右。
判别浮点数a,b是否相等的写法:fabs(a-b) < eps
此外,对于某些问题的数据我们可以进行一下预处理,使其变为整型数,整型数不存在精度的问题,所以可以直接判断,如:
由于浮点数在计算机中的存储问题,所以不论是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; }
相关文章推荐
- redis 跨机器集群启动出错
- doctrine配置安装
- 《第一行代码--Android》学习笔记--第一章:开始起航:思路
- nyoj--124--中位数(水题)
- Undefined symbols for architecture armv7
- 关于viewholder总是报Java.lang.NullPointerException。
- doctrine安装配置
- iBatis.Net(C#)SQL数据映射
- php 数组 array_values () array_key()
- CBuilder 添加自定义工具:打开当前文件所在的文件夹
- 一个java程序员自学IOS开发之路(七)
- Tomcat设置虚拟目录的方法
- 计算ios沙盒中的文件大小
- iOS开发---一句话写单例方法
- ue4中读取excel导出的二进制流文件
- POJ 1664 放苹果
- php 数组 array_intersect_key() array_unique()移除重复
- LeetCode OJ:Palindrome Partitioning(回文排列)
- [Emacs] 使用w3m上网
- 转】函数调用 堆栈