【温故而知新】JavaScript数字精度丢失问题

2024-01-11 16:20

本文主要是介绍【温故而知新】JavaScript数字精度丢失问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、概念

在JavaScript中,由于基于IEEE 754标准的浮点数表示方法,导致在进行数字运算时可能会发生精度丢失的情况。

由于计算机内部使用二进制来表示浮点数,而无法准确地用有限的二进制位数表示所有的实数。因此,浮点数在存储和计算时会存在舍入误差。

比如,当进行小数运算时可能会出现精度丢失的情况。例如,0.1 + 0.2 的结果在JavaScript中不是期望的0.3,而是一个近似值0.30000000000000004。这是因为0.1和0.2在二进制表示中无法被精确表示,导致在计算时发生了舍入误差。

此外,JavaScript中整数的运算也可能会出现精度丢失的情况。当进行超出JavaScript能够表示的数字范围的计算时,结果可能会失去精度。例如,Math.pow(2, 53) + 1 的结果在JavaScript中是相同的值,而不是期望的2的53次方加1。这是因为JavaScript中的数字表示范围是有限的,超出这个范围的数字会被截断或近似表示。

为了避免精度丢失的问题,可以使用一些解决方案,如使用整数代替浮点数进行计算,或者使用特定的数学库来处理精确计算。

二、常见问题

在JavaScript中,关于数字精度丢失的一些常见问题包括:

  1. 小数运算精度丢失:由于浮点数在计算机中的二进制表示存在舍入误差,进行小数运算时可能会导致结果的精度丢失。例如,0.1 + 0.2 的结果不是期望的0.3,而是一个近似值0.30000000000000004。

  2. 整数运算超出范围:JavaScript中使用64位双精度浮点数表示数字,整数的表示范围是有限的。当进行超出该范围的整数运算时,结果可能会失去精度。例如,Math.pow(2, 53) + 1 的结果不是期望的2的53次方加1,而是相同的值。

  3. 数字转换时的精度丢失:在将字符串转换为数字或将数字转换为字符串时,可能会出现精度丢失的情况。例如,将字符串"0.1"转换为数字时,可能会得到一个近似值0.1而不是精确的0.1。

  4. 浮点数比较精度问题:由于浮点数在计算机中的二进制表示存在舍入误差,直接进行浮点数的比较可能会导致意外的结果。例如,0.1 + 0.2 == 0.3 的结果可能是false,因为实际计算结果存在微小的舍入误差。

为了避免这些问题,可以使用一些技巧和库来处理精度丢失。例如,使用toFixed()方法来指定小数点后的精度,使用整数进行计算,或使用专门的数学库如Decimal.js来处理精确计算。

三、案例

下面是一些常见的 JavaScript 数字精度丢失案例代码以及解决方法:

  1. 小数运算精度丢失:
// 精度丢失
console.log(0.1 + 0.2); // 输出:0.30000000000000004// 解决方法:使用toFixed()方法指定小数点后的位数
console.log((0.1 + 0.2).toFixed(1)); // 输出:0.3
  1. 整数运算超出范围:
// 精度丢失
console.log(Math.pow(2, 53) + 1); // 输出:9007199254740992// 解决方法:使用 BigInt 类型来处理超出范围的整数运算
console.log(BigInt(Math.pow(2, 53)) + BigInt(1)); // 输出:9007199254740993n
  1. 数字转换时的精度丢失:
// 字符串转换为数字时的精度丢失
console.log(Number("0.1")); // 输出:0.1// 解决方法:使用 parseFloat() 或 Number.parseFloat() 方法来进行精确的浮点数转换
console.log(parseFloat("0.1")); // 输出:0.1
  1. 浮点数比较精度问题:
// 浮点数比较精度问题
console.log(0.1 + 0.2 == 0.3); // 输出:false// 解决方法:使用一个阈值进行比较,判断两个浮点数是否接近
const threshold = 0.0001;
console.log(Math.abs(0.1 + 0.2 - 0.3) < threshold); // 输出:true

需要根据具体情况选择合适的解决方案来处理数字精度丢失问题,并确保得到预期的结果。

四、后记

JavaScript是一种广泛应用于网页开发的脚本语言,它可以用来为网页添加交互性和动态特效。JavaScript可以在网页中直接嵌入,也可以作为外部文件引用。

以下是JavaScript的一些重要特点和用法:

  1. 脚本语言:JavaScript是一种解释型脚本语言,不需要编译,可以直接在浏览器中执行。
  2. 弱类型语言:JavaScript是一种弱类型语言,变量的数据类型可以随时改变,不需要声明变量的类型。
  3. 事件驱动:JavaScript可以通过监听用户的操作或者其他事件触发特定的代码执行,实现网页的交互性。
  4. DOM操作:JavaScript可以通过文档对象模型(DOM)来操作网页的HTML元素,可以动态地添加、修改和删除元素。
  5. 表单验证:JavaScript可以通过表单验证来确保用户输入的数据符合要求,提供更好的用户体验。
  6. AJAX:JavaScript可以通过AJAX技术实现网页的异步加载,可以在不刷新整个页面的情况下更新部分内容。
  7. JSON:JavaScript Object Notation(JSON)是一种轻量级的数据交换格式,JavaScript可以很方便地解析和生成JSON数据。
  8. 库和框架:JavaScript拥有丰富的库和框架,如jQuery、React、Angular等,可以简化开发过程并提供更强大的功能。

JavaScript是一种强大且灵活的语言,可以用来创建复杂的交互式网页,并且可以与HTML和CSS无缝配合,实现出色的用户体验。

五、热门文章

【温故而知新】JavaScript的继承方式有那些
【温故而知新】JavaScript中内存泄露有那几种
温故而知新】JavaScript函数式编程
【温故而知新】JavaScript的防抖与节流
【温故而知新】JavaScript事件循环
【温故而知新】JavaScript的Document对象
【温故而知新】JavaScript的BOM之Screen/Location/History对象
【温故而知新】JavaScript的BOM之Navigator对象
【温故而知新】JavaScript的BOM之Window对象
【温故而知新】JavaScript数据结构详解
【温故而知新】JavaScript数据类型
RESTful API,如何构建 web 应用程序
jQuery实现轮播图代码
vue实现文本上下循环滚动
Vue运用之input本地上传文件,实现传参file:(binary)
js判断各种浏览器
uni-app详解、开发步骤、案例代码

这篇关于【温故而知新】JavaScript数字精度丢失问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/594956

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

springboot下载接口限速功能实现

《springboot下载接口限速功能实现》通过Redis统计并发数动态调整每个用户带宽,核心逻辑为每秒读取并发送限定数据量,防止单用户占用过多资源,确保整体下载均衡且高效,本文给大家介绍spring... 目录 一、整体目标 二、涉及的主要类/方法✅ 三、核心流程图解(简化) 四、关键代码详解1️⃣ 设置

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java实现删除文件中的指定内容

《Java实现删除文件中的指定内容》在日常开发中,经常需要对文本文件进行批量处理,其中,删除文件中指定内容是最常见的需求之一,下面我们就来看看如何使用java实现删除文件中的指定内容吧... 目录1. 项目背景详细介绍2. 项目需求详细介绍2.1 功能需求2.2 非功能需求3. 相关技术详细介绍3.1 Ja

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

spring中的ImportSelector接口示例详解

《spring中的ImportSelector接口示例详解》Spring的ImportSelector接口用于动态选择配置类,实现条件化和模块化配置,关键方法selectImports根据注解信息返回... 目录一、核心作用二、关键方法三、扩展功能四、使用示例五、工作原理六、应用场景七、自定义实现Impor

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项