浮点数精度问题处理

参考

由于浮点数在计算机中的存储问题,所以不论是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;
}
前端浮点数精度处理问题可以采用以下几种解决方案: - **了解浮点数表示方式和限制**:在JavaScript中,所有的Number都是以64-bit的双精度浮点数存储,双精度浮点数在64位上按“1-11-52”模式划分,1位最高位表示符号位,11位表示指数部分,52位表示尾数部分。了解这些知识有助于在处理浮点数时谨慎操作,避免因浮点数的表示方式导致精度问题[^1][^3]。 - **使用字符串格式化**:根据具体应用场景,可使用字符串格式化的方式来处理浮点数精度问题,但具体使用方式未在给定引用中详细说明。 - **四舍五入**:可以使用`Math.round`方法进行四舍五入操作。例如,对于`0.1 + 0.2`的结果,可通过`Math.round(result * 10) / 10`来处理,让结果更符合预期。示例代码如下: ```javascript let result = 0.1 + 0.2; result = Math.round(result * 10) / 10; console.log(result); // 输出结果为0.3 ``` - **转换为整数进行运算**:将浮点数转换为整数进行运算,避免浮点数直接运算带来的精度问题,不过给定引用中未详细提及具体实现方式。 - **使用专门的库**:当应用需要处理非常高的精度或者复杂的小数运算时,可以使用专门设计来处理精度数学运算的库,如`decimal.js`和`big.js`。 - **decimal.js**:在Node.js环境中,可通过`require('decimal.js')`引入;在浏览器中可直接引入`<script src="https://cdn.jsdelivr.net/npm/decimal.js/decimal.min.js"></script>`。示例代码如下: ```javascript const Decimal = require('decimal.js'); // 如果是在Node.js环境中 // 在浏览器中可以直接引入 <script src="https://cdn.jsdelivr.net/npm/decimal.js/decimal.min.js"></script> let num1 = new Decimal('0.1'); let num2 = new Decimal('0.2'); console.log(num1.plus(num2).toNumber()); // 输出: 0.3 ``` - **big.js**:在Node.js环境中,可通过`require('big.js')`引入;在浏览器中可直接引入`<script src="https://cdn.jsdelivr.net/npm/big.js/big.min.js"></script>`。示例代码如下: ```javascript const Big = require('big.js'); // 如果是在Node.js环境中 // 在浏览器中可以直接引入 <script src="https://cdn.jsdelivr.net/npm/big.js/big.min.js"></script> let num1 = new Big('0.1'); let num2 = new Big('0.2'); console.log(num1.plus(num2).toString()); // 输出: "0.3" ``` - **谨慎处理浮点数比较**:由于浮点数计算存在精度问题,在进行浮点数比较时需要谨慎操作,给定引用中未详细说明具体的比较方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值