JavaScript 解决计算误差

2023-11-04

JavaScript 解决计算误差

JavaScript 中执行计算时,精度误差是一个常见的问题。这是因为 JavaScript 使用二进制表示浮点数,因此不能精确表示所有十进制数。这会导致在 JavaScript 中执行精确的计算时出现误差。

例如,下面的计算会得到一个误差:

0.1 + 0.2 // 0.30000000000000004

这种误差可能会在比较数字时导致问题,例如:

0.1 + 0.2 === 0.3 // false

为了避免这种情况,可以使用一些技术来比较数字,例如使用一个指定的精度来比较数字,或者使用一个指定的误差范围来比较数字。

精度比较数字的方法:

function approxEqual(a, b, precision) {
	  return Math.abs(a - b) < precision;
}
approxEqual(0.1 + 0.2, 0.3, 0.0001) // true

使用误差范围比较数字的方法:

在比较两个数字是否相等时,不是比较它们的值是否完全相等,而是比较它们的差值是否在指定的误差范围之内。这样,即使两个数字的值并不完全相等,也可以视为相等。

举个例子,假设我们有两个数字 a 和 b,并希望比较它们是否相等。我们可以使用如下代码来比较它们:
function withinErrorMargin(a, b, errorMargin) {
	return Math.abs(a - b) <= errorMargin;
}
withinErrorMargin(0.1, 0.2, 0.0001) // false
withinErrorMargin(0.1, 0.2, 0.1) // true

在上面的代码中,我们使用了 Math.abs 函数来计算 a 和 b 的差值的绝对值,然后将结果与误差范围进行比较。如果差值的绝对值小于等于误差范围,则视为两个数字相等。

在使用误差范围比较数字时,需要注意误差范围的大小。如果误差范围过大,可能会导致意想不到的结果;如果误差范围过小,则可能会影响比较的精确度。

使用第三方库进行精确计算的方法

使用 Decimal.js

Decimal.js 是一个用于精确计算的 JavaScript 库,支持浮点数和整数的高精度运算。

使用 Decimal.js进行精确计算的示例如下:

const a = new Decimal(0.1);
const b = new Decimal(0.2);
const c = a.add(b);
console.log(c.toString()); // '0.3'

在上面的示例中,我们使用 new Decimal 函数将数字转换为 Decimal 类型,然后使用 add 方法进行加法运算。由于使用了 Decimal.js,因此计算结果是准确的。

此外,Decimal.js 还提供了其他类型的数学运算方法,例如 subtract、multiply divide

const d = c.subtract(a);
console.log(d.toString()); // '0.2'

const e = c.multiply(a);
console.log(e.toString()); // '0.03'

const f = c.divide(a);
console.log(f.toString()); // '3'

使用第三方库进行精确计算的优点是,可以简化代码,并且不会出现精度误差的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 解决计算误差 的相关文章

随机推荐

  • PHP通过OpenSSL生成证书、密钥并且加密解密数据

    转自 http www open open com code view 1421032678562 generate php
  • Interlaken协议简介

    英文原文 Interlaken Protocol Definition A Joint Specification of Cortina Systems and Cisco Systems 1 简介 网络应用中两种主流的芯片到芯片的高速网络
  • 三数之和——双指针法的实践

    一 方法介绍 双指针法有时也叫快慢指针 在数组里是用两个整型值代表下标 在链表里是两个指针 一般能实现O n 的时间解决问题 两个指针的位置一般在第一个元素和第二个元素或者第一个元素和最后一个元素 快指针在前 探路 当符合某种条件时慢指针向
  • llvm编译linux内核,linux手动编译llvm/clang

    centos 7 安装前置依赖 sudo yum install git python devel libffi devel graphviz devel elfutils libelf devel readline devel libed
  • vue2 视频下载本地,图片压缩包下载

    视频单独下载 通过url 转为blob格式的数据 下载视频 getVideoArrayBuffer url name var xhr new XMLHttpRequest xhr open GET url true xhr response
  • Tenginx UDP反向代理实现DNS服务器负载和高可用

    worker processes auto events worker connections 65535 pid var log nginx nginx pid stream upstream dns servers server 192
  • 英文中1-100表达

    数词 1 基数词 1 2 3 2 序数词 第一 第二 类型 1 2 3 4 5 6 7 8 9 10 基数词 one two three four five six seven eight nine ten 序数词 first second
  • 并发请求

    PHP并发请求种类 若干个客户机 Web 浏览器 可以同时请求同一个 PHP 解释的页面 而 Web 服务器将差不多同时返回所有这些页面 一个 Web 页面不会妨碍其他 Web 页面的发送 尽管可能会由于诸如服务器内存或网络带宽之类的受限资
  • VS 关于头文件和库文件的添加

    关于头文件和库文件的添加 一直没有很清晰的认识 下面是从网上搜索到的 自己总结的 也有一些不是很明白的 希望后续能够解决完善 也希望大神们能答疑解惑 一 头文件的添加比较清楚 一般就是 方法一 将所包含的头文件复制到当前目录 下 这个比较有
  • JDY-31蓝牙模块使用指南

    前言 本来是想买个hc 05 这种非常常用的模块 但是在优信电子买的时候 说有个可以替代的 没注意看 买回来折腾半天 这个模块是从机模块 蓝牙模块分为主机从机和主从一体的 主机与从机的区别就是 主机可以主动连接从机 但是从机不能主动连接主机
  • 11月15日 作业2,黑洞子弹,子弹发射位置朝着准星方向 UE4斯坦福 学习笔记

    黑洞子弹 这里遇到了问题 作业要求两个子弹 但是我跟着教程创建的黑洞子弹射出后不能吸引周围的物体 传送子弹不起作用 需要未来回来修改 创建一个子弹的Base 继承AActor h文件 protected Called when the ga
  • 魔兽世界不同服务器集合石显示的内容,魔兽怀旧服:详解TBC集合石机制,各副本要求不同,难怪无法使用...

    虽然在魔兽世界60级怀旧服中副本门口有集合石的存在 但是完全就是摆设 直到TBC前夕开放之后 这些集合石才真正可以使用了 然而最近一天 怀旧服中的玩家们在点击集合石的时候总是提示无法使用 还以为集合石出现了BUG 其实这并非BUG 之所以集
  • 字符串转换(蓝桥杯)

    题目描述 小蓝拥有两个字符串 S TS T 他希望通过如下操作使得字符 SS 转换为字符串 TT 操作有一下三种 删除一个字符 插入一个字符 将一个字符改为另一个字符 问最少需要操作多少次才可以使得字符串 SS 转换为字符串 TT 输入描述
  • 集成运放

    同相比例运算放大电路 信号源直接加在同相端 内阻为无穷大 缩小n倍的话就是
  • iOS开发之第三方支付支付宝支付教程,史上最新最全第三方支付宝支付方式实现、支付宝集成教程,支付宝实现流程

    本章项目demo https github com zhonggaorong alipayDemo 支付宝支付大致流程为 1 公司与支付宝进行签约 获得商户ID partner 和账号ID seller 和私钥 privateKey 开发中
  • 登录界面

  • 华为OD机试真题- 字符串解密【2023Q1】【JAVA、Python、C++】

    题目描述 给定两个字符串string1和string2 string1是一个被加扰的字符串 string1由小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a f 组成 string1里面可能包含0个或多个加扰子串
  • 如何使用策略模式处理多种类型请求

    1 需求简述 现在有一个活动 活动场景包含布置书籍作业 布置短文作业 布置一课一练作业 以后还可能会新增其它类型的活动 每一种活动场景有自己对应的完成逻辑和奖励 现在定义对应的场景值如下 活动名称 活动场景值 布置书籍作业 11 布置短文作
  • PaxosLease:实现租约的无盘Paxos算法

    PaxosLease 实现租约的无盘Paxos算法 英文 PaxosLease Diskless Paxos for Leases 中文 http dsdoc net paxoslease index html
  • JavaScript 解决计算误差

    JavaScript 解决计算误差 在 JavaScript 中执行计算时 精度误差是一个常见的问题 这是因为 JavaScript 使用二进制表示浮点数 因此不能精确表示所有十进制数 这会导致在 JavaScript 中执行精确的计算时出