JS之为什么0.1+0.2不等于0.3

文章目录

在前端以及几乎所有现代编程语言中, 0.1 + 0.2 不等于 0.3 这是由于浮点数表示存在精度问题。要理解这个问题,我们需要了解浮点数的表示方式以及计算机内部的运算原理。

浮点数表示方式

大多数编程语言使用 IEEE 754 标准来表示浮点数,该标准使用二进制格式来存储浮点数。浮点数由三部分组成:

  1. 符号位:表示数值的正负。
  2. 指数:决定数值的幅度。
  3. 尾数(或称有效数字、尾数部分):表示具体的数字。

二进制表示的小数

在二进制中,并非所有的十进制小数都能被精确表示。例如:

  • 十进制 0.1 转换为二进制是一个无限循环小数:0.0001100110011001100110011...
  • 十进制 0.2 同样是一个无限循环小数:0.0011001100110011001100110...

由于存储空间限制和计算精度,计算机只能取这无限循环小数的有限位来近似表示。结果就是,0.10.2 的二进制表示都不是完全准确的,而是某个最接近的近似值。

加法问题

计算机在进行加法运算时,将这两个近似值相加,结果并不会是确切的 0.3,而是一个近似的值,可能是 0.30000000000000004 或类似的数值。因此,在进行相等性比较时,0.1 + 0.2 === 0.3 将是 false

例子

看一下代码:

javascript 复制代码
console.log(0.1 + 0.2); // 输出: 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // 输出: false

正如前面解释的,加法运算的结果并不是精确的0.3

如何处理精度问题

当需要处理货币计算或其他要求高精度的场景时,可以采取一些方法:

1. 使用数字比较的容差(epsilon)

当比较两个浮点数时,可以设置一个小的容差值来判断它们是否足够接近。

javascript 复制代码
const EPSILON = Number.EPSILON || 2.220446049250313e-16;
console.log(Math.abs(0.1 + 0.2 - 0.3) < EPSILON); // 输出: true
2. 使用整数

一种常见的实践方法是在处理货币时使用整数。例如,把金额转换成以分为单位的整数来进行计算。

javascript 复制代码
const a = 10; // 表示 $0.10
const b = 20; // 表示 $0.20
const sum = a + b; // 表示 $0.30

console.log(sum === 30); // 输出: true
console.log((sum / 100).toFixed(2)); // 输出: "0.30"
3. 使用专用库

为了解决 JavaScript 中的精度问题,有许多第三方库可以进行精确的十进制运算。例如,decimal.jsbignumber.js

使用 decimal.js 举例:

javascript 复制代码
const Decimal = require('decimal.js');

const a = new Decimal(0.1);
const b = new Decimal(0.2);
const sum = a.plus(b);

console.log(sum.toString()); // 输出: "0.3"
console.log(sum.equals(0.3)); // 输出: true

结论

0.1 + 0.2 不等于 0.3 是由浮点数表示和计算精度导致的。在实际开发中,需要格外注意浮点数的运算误差,可以使用适当的方法来规避这些问题。

相关推荐
yngsqq6 分钟前
c#使用高版本8.0步骤
java·前端·c#
流星白龙9 分钟前
【C++习题】10.反转字符串中的单词 lll
开发语言·c++
尘浮生16 分钟前
Java项目实战II基于微信小程序的校运会管理系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
MessiGo16 分钟前
Python 爬虫 (1)基础 | 基础操作
开发语言·python
Tech Synapse22 分钟前
Java根据前端返回的字段名进行查询数据的方法
java·开发语言·后端
乌啼霜满天24930 分钟前
JDBC编程---Java
java·开发语言·sql
Myli_ing41 分钟前
考研倒计时-配色+1
前端·javascript·考研
色空大师43 分钟前
23种设计模式
java·开发语言·设计模式
余道各努力,千里自同风43 分钟前
前端 vue 如何区分开发环境
前端·javascript·vue.js
PandaCave1 小时前
vue工程运行、构建、引用环境参数学习记录
javascript·vue.js·学习