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.1 和 0.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.js 和 bignumber.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 是由浮点数表示和计算精度导致的。在实际开发中,需要格外注意浮点数的运算误差,可以使用适当的方法来规避这些问题。

相关推荐
鬼手点金3 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
软件技术NINI3 小时前
美妆商城html+Css+js 4页
javascript·css·html
蛋蛋的就会顺顺的3 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
程序员Sunday3 小时前
TypeScript 的 any、unknown、never 有什么区别?
前端·面试·typescript
朱涛的自习室4 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
码艺-Alimjan4 小时前
Tauri 源码备份 · 打包 & 解压 总结,源码收集之路
前端·javascript·vue.js
小马不起床4 小时前
零基础玩转 FastAPI_11:前端后台管理页面
前端·状态模式·fastapi
死磕音视频5 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
子非鱼a6 小时前
【文件上传】一个普普通通的edu16
前端
美狐美颜SDK开放平台6 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk