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

相关推荐
布谷歌1 分钟前
常见的OOM错误 ( OutOfMemoryError全类型详解)
java·开发语言
WangJunXiang63 分钟前
GFS分布式文件系统
开发语言·php
民乐团扒谱机3 分钟前
【微实验】基于matlab的音频提取与信号滤波处理
开发语言·matlab·音视频
SomeB1oody21 分钟前
【Python深度学习】3.4. 循环神经网络(RNN)实战:预测股价
开发语言·人工智能·python·rnn·深度学习·机器学习
良木生香30 分钟前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
Bug 挖掘机1 小时前
一篇理清Prompt,Skill,MCP之间的区别
开发语言·软件测试·python·功能测试·测试开发·prompt·ai测试
寒秋花开曾相惜1 小时前
(学习笔记)4.1 Y86-64指令集体系结构(4.1.4 Y86-64异常&4.1.5 Y86-64程序)
开发语言·jvm·数据结构·笔记·学习
码界筑梦坊2 小时前
302-基于Python的安卓应用市场数据可视化分析推荐系统
开发语言·python·信息可视化·毕业设计·fastapi
不会聊天真君6472 小时前
JavaScript基础语法(Web前端开发笔记第三期)
前端·javascript·笔记