13-为什么在JavaScript中0.1 + 0.2不等于0.3?

为什么在JavaScript中0.1 + 0.2不等于0.3?

笔记+分享
在编写JavaScript代码时,你可能会遇到一个奇怪的现象:0.1 + 0.2并不等于0.3。这个问题并不仅仅局限于JavaScript,它在许多编程语言中都会出现。本文将解释背后的原因,并探讨如何处理这个问题。

浮点数的表示

首先,我们需要了解计算机是如何表示小数的。计算机使用二进制(base-2)来表示所有数据,包括小数。而在二进制中,并不是所有的十进制小数都能精确地表示。

在十进制系统中,0.1可以表示为1/10。但是,在二进制系统中,0.1表示为一个无限循环的小数,类似于在十进制中1/3表示为0.3333…。二进制中的0.1表示为0.0001100110011001100110011001100...(循环)。

IEEE 754标准

JavaScript(以及大多数编程语言)使用IEEE 754标准来表示浮点数。这是一种二进制浮点数表示方法,包括32位和64位两种格式。JavaScript使用64位双精度格式。

在IEEE 754标准下,浮点数表示为:

  • 1位符号位(0表示正,1表示负)
  • 11位指数位
  • 52位尾数位(加上隐含的1位)

对于像0.1和0.2这样的数字,这种表示方法会导致精度损失。将这些十进制小数转换为二进制浮点数时,它们只能近似表示。这种近似表示导致了0.1 + 0.2的结果不完全等于0.3。

具体示例

让我们看一个具体的例子:

  • 0.1在二进制浮点数中的近似表示是:0.00011001100110011001100110011001100110011001100110011
  • 0.2在二进制浮点数中的近似表示是:0.001100110011001100110011001100110011001100110011001101

当你将这两个值相加时,得到的结果是:

  • 0.1 + 0.2 ≈ 0.30000000000000004

这并不是精确的0.3,而是一个非常接近0.3的数值,但在计算机的精度限制下,它们并不相等。

处理浮点数精度问题

为了在JavaScript中正确处理浮点数的精度问题,可以采取以下方法:

  1. 使用容差值进行比较
    由于直接比较浮点数可能会失败,使用一个非常小的容差值来判断两个浮点数是否接近。

    const a = 0.1;
    const b = 0.2;
    const sum = a + b;
    const epsilon = 0.0000001;if (Math.abs(sum - 0.3) < epsilon) {console.log('0.1 + 0.2 is approximately equal to 0.3');
    } else {console.log('0.1 + 0.2 is not equal to 0.3');
    }
    
  2. 使用整数运算
    将浮点数转换为整数进行运算,然后再将结果转换回浮点数。这在涉及货币计算时特别有用。

    const a = 0.1 * 100; // 10
    const b = 0.2 * 100; // 20
    const sum = a + b; // 30console.log(sum / 100); // 0.3
    
  3. 使用BigDecimal库
    对于需要高精度计算的场景,可以使用BigDecimal库进行处理,这些库能够精确处理十进制数。

    // 使用BigDecimal.js库
    const Big = require('big.js');
    const a = new Big(0.1);
    const b = new Big(0.2);
    const sum = a.plus(b);console.log(sum.toString()); // 0.3
    

结论

0.1 + 0.2不等于0.3的原因在于计算机使用二进制浮点数表示小数时存在精度损失。理解这一点,并采用适当的方法来处理浮点数计算,可以帮助我们避免相关的精度问题。在日常开发中,了解并合理处理这种精度问题至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“慢公司”小红书,加速布局大模型

自成立至今&#xff0c;小红书一直保持低调并被形容为“慢公司”&#xff0c;而这也反映在大模型相关产品线上。尽管上线了多项功能和应用&#xff0c;存在感却稍显不足。 进入2024年&#xff0c;小红书在大模型领域的探索悄然加速&#xff0c;持续引发市场关注度。 多方消息…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难&#xff1a;将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40&#xff0c;按照向导将fedora40安装到真机的sda7分区中得到报错如下内容&#xff1a; Failed to find a suitable stage1 device: E…

socket.gaierror: [Errno 11001] getaddrinfo failed

socket.gaierror: [Errno 11001] getaddrinfo failed 错误通常表示在解析主机名或 IP 地址时出现问题。这可能是因为提供的 IP 地址或主机名无效&#xff0c;或者存在 DNS 解析问题。 打印日志发现config.ini中的host不能加引号

Javaweb基础之json

大家好&#xff0c;这里是教授.F 目录 引入&#xff1a; 定义格式&#xff1a; json规制&#xff1a; 字符串转json&#xff1a; json转字符串: 字符串和json转化细节&#xff1a; json在java中的使用: 应用实例&#xff1a; JavaBean和json字符串的转换&#xff1a; l…

ZL-GL-4离体组织灌流系统测试在恒温条件下离体标本的肌张拉力

简单介绍&#xff1a; 离体组织灌流系统为生理实验及药理实验提供恒温环境&#xff0c;在麦氏浴皿内加养液同时能通氧&#xff0c;测试在恒温条件下离体标本的肌张拉力&#xff0c;离体组织灌流系统具有进气口,配备微调固定器,省时省力,并提高了实验效率,同时可方便串联恒温供水…

django ORM model update常规用法

Django ORM(对象关系映射)提供了一种强大而直观的方式,通过Python类和方法与数据库交互。在Django模型中更新记录是一个常见的任务,可以通过多种方式完成。以下是一些常见的更新记录的方法: 1. 更新单条记录 使用 save() 方法 最直接的方法是先获取记录,修改其属性,然…

prometheus+alertmanager+webhook钉钉机器人告警

版本&#xff1a;centos7.9 python3.9.5 alertmanager0.25.0 prometheus2.46.0 安装alertmanager prometheus 配置webhook # 解压&#xff1a; tar -xvf alertmanager-0.25.0.linux-amd64.tar.gz tar -xvf prometheus-2.46.0.linux-amd64.tar.gz mv alertmanager-0.25.0.linu…

C/S模型测试及优化

1 1.1代码示例 #include<stdio.h> #include<stdio.h>#include <sys/types.h> /* See NOTES */ #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h> /* superset of previous */ #include <arpa/inet.…

NoSQL数据库:定义、特性、分类与应用场景的探索

目录 一、引言 二、NoSQL的定义与起源 三、NoSQL的特性 四、NoSQL的分类 五、NoSQL的应用场景 六、NoSQL数据库在物联网&#xff08;IoT&#xff09;应用中的优势 最近在做关于NoSQL的市场调研&#xff0c;于是浅写下调研的总结&#xff0c;给大家分享&#xff0c;当做科…

计算机基础知识

计算机基础知识 计算机是如何工作的 在本节内容中,介绍了计算机核心工作机制,计算机结构,框架等,计算机需求在人类的历史中是广泛存在的,发展大体经历了从一般计算工具到机械计算机到目前的电子计算的发展过程 文章目录 计算机基础知识一、冯诺依曼体系结构二、CPUCPU的核心参…

接口测试JSON/XML请求

目录&#xff1a; JSON请求XML请求 JSON简介&#xff1a; 是JavaScript Object Notation的缩写是一种轻量级的数据交换格式是理想的接口数据交换语言 JSON请求&#xff1a; 构造JSON请求体JSON字符串HashMap对象Jackson库 构造JSON请求体&#xff1a; package com.ceshi…

STM 32_HAL_SDIO_SD卡

STM32的SDIO&#xff08;Secure Digital Input Output&#xff09; 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信&#xff0c;支持多媒体卡&#xff08;MMC卡&#xff09;、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…

JAVA-学习

一、垃圾回收机制 1、为什么要进行垃圾回收机制 如果不进行垃圾回收&#xff0c;内存迟早都会被消耗空&#xff0c;因为我们在不断的分配内存空间而不进行回收。除非内存无限大&#xff0c;我们可以任性的分配而不回收&#xff0c;但是事实并非如此。所以&#xff0c;垃圾回收…

【大模型】在大语言模型的架构中,Transformer有何作用?

Transformer在大语言模型架构中的作用 Transformer是一种用于序列到序列&#xff08;Seq2Seq&#xff09;任务的深度学习模型&#xff0c;由Vaswani等人于2017年提出。在大语言模型&#xff08;LLM&#xff09;的架构中&#xff0c;Transformer扮演着关键的角色&#xff0c;它…

全面解析LG webOS:从开发到智能电视的演进

本文全面探讨了LG webOS的发展历程、技术特点、开发资源以及与Android TV的对比。涵盖了webOS的历史背景、功能特性、开发工具、用户体验以及市场表现&#xff0c;旨在为读者提供一个深入了解webOS的全面视角。 文章目录 webOS的历史与发展从Palm到LG的收购历程关键版本的发布日…

前端性能优化总结笔记

资源加载优化 DNS预解析 简单介绍: DNS 的作用是将域名解析为 IP 地址&#xff0c;解析的过程是耗时的&#xff0c;转化后会做本地缓存&#xff0c;我们的优化的目标主要是针对用户第一次访问站点的时候陷入长时间白屏的问题。 DNS 解析可以分为两类: 第一类是页面 DNS 解…

Flink中因java的泛型擦除导致的报错及解决

【报错】 Exception in thread "main" org.apache.flink.api.common.functions.InvalidTypesException: The return type of function Custom Source could not be determined automatically, due to type erasure. You can give type information hints by using th…

【php实战项目训练】——thinkPhP的登录与退出功能的实现,让登录退出畅通无阻

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Mendix 创客访谈录|Mendix助力开发高手10日交付复杂应用,且支持移动端呈现

本期创客 莊秉勳 布鲁科技技术顾问 各位Mendix社群的夥伴好&#xff0c;我是莊秉勳&#xff0c;大家也可以叫我Danny。 我大學是資訊科學背景&#xff0c;在與Mendix相遇前&#xff0c;曾在一上市製造企業&#xff0c;擔任軟體工程師&#xff0c;負責企業內部軟體開發&#xf…

Virtualbox 安装unbuntu + qemu

0. 前言 关于 Virualbox 安装虚拟机的优秀文章太多了&#xff0c;笔者主要是着重梳理一些安装小细节&#xff0c;利己利人&#xff01;&#xff01; 如果需要保姆式的安装教程&#xff0c;可以查看后续的参考链接。 1. VirtualBox 的安装 直接去官网搜索最近的软件即可&…