如何在使用 Chai 时处理浮点数比较问题

在前端测试时,Chai 是一个非常流行的断言库。但在处理浮点数比较时,会经常遇到误差问题。这篇文章将介绍这些问题的原因,以及如何避免它们,使 Chai 在处理浮点数比较时更加准确可靠。

浮点数比较问题的原因

JavaScript 中的浮点数类型采用 IEEE 754 标准的双精度格式。虽然这种格式支持表示非常大和非常小的数字,但它在存储小数时会产生舍入误差。

例如:

--- - --- -- -------------------

这个问题由于浮点数采用二进制表示,而在二进制中很难准确表示某些十进制小数产生的误差导致。而在进行比较时,这种误差可能会导致测试失败。

Chai 中的大部分比较方法都是使用 JavaScript ===== 操作符来实现的。再次看到刚才的示例:

---------- - ------------------- -- --------------- -------- ------------------- -- ----- ---

这个测试失败了,尽管我们期望的结果是 0.3。

解决浮点数比较问题

为了解决这个问题,我们需要在进行比较之前,使用一些方式来规避这些舍入误差的可能性。下面是一些解决浮点数比较的方法。

方法一:四舍五入

四舍五入是最常用的方法之一。通过保留所需小数位数,再对其进行四舍五入处理,可以使两个数在比较时更加准确。

-------- ------------- ---------- -
  ----- ------ - ------------ -----------

  ------ ----------------- - ------- - -------
-

---------------- - ---- ------------------ -- -------

round 函数将输入的数字乘以指定的精度,再使用 Math.round 对结果进行四舍五入。则在四舍五入不同的时候,将舍入方向考虑在内的处理方法便能降低原始数字带来的误差。

这种方法同样也适合于其他数字的处理,而精度的参数也能根据应用情况来自由设定。

方法二:比较相对误差

如果两个数相差很小,则可以通过比较它们之间的相对误差来比较它们。相对误差是两个数之间的差与这两个数的平均值之比。

-------- -------------------------- --------- ------------------- - ----- -
  ----- ---- - --------------- - ----------
  ----- ------- - ----------------- - ------------------- - --

  ------ ---- -- ------- - --------------------
-

----------------------------- - ---- ----------------- -- -------

approximatelyEqual 函数接受两个数字以及相对误差的参数,并将它们之间的差与它们的平均值进行比较。如果它们之间的相对误差小于相对误差的阈值,函数将返回 true

无论数字的精度如何高,如果这些数字真正接近,则若使用某个固定数字来初始化误差值,可以获得更好的准确性。

方法三:使用 Chai 的数值比较插件

Chai 有一个插件,叫 chai-numeric,它包含一些方法,可以在比较浮点数时使用相对误差或绝对误差来处理舍入误差的问题。

----- ---- - ----------------
----- ----------- - ------------------------

----------------------

---------- - ------------------- -- --------------- -------- ------------------- -- ----- ---
---------- - ------------------ ------ -- -------

上面的代码通过 chaiNumeric 插件安装了一些新的 “数值比较” 方法。它们在 equalTo、above、below 之类的 Chai 断言中添加了误差值的参数。

与我们手动编写的其他方法相比,这些方法更加简洁易用。

结论

在测试前端应用程序时,浮点数比较的问题是非常常见的。通过了解这些问题的原因以及采用特定的处理方法,我们可以避免这些问题。使用以上提到的这些方法,我们可以更加准确地测试前端应用程序,并提高测试的可靠性,避免追日误差从而浪费开发时间。

——End——

【代码示例】:

----- ------ - -----------------------

-------------- ------- ------- -------- -- -

    ---------- --- -------- -- -
        -------- ------------- ---------- -
            ----- ------ - ------------ -----------
            ------ ----------------- - ------- - -------
        -

        ---------------- - ---- ------------------

        --------------------- --------------------

        --------------------- --------------------

        ------------------- -----------------
    ---

    ---------- --- -------- -- -
        -------- -------------------------- --------- ------------------- - ----- -
            ----- ---- - --------------- - ----------
            ----- ------- - ----------------- - ------------------- - --
            ------ ---- -- ------- - --------------------
        -

        ----------------------------- - ---- -----------------

        ---------------------------------- -- ---------------------

        ---------------------------------- -- -------------------

        -------------------------------- --- ------------------
    ---

    ---------- --- -------- -- -
        ----- ---- - ---------------- ----------- - ------------------------
        ----------------------

        ---------- - ------------------ ------

        ---------------------------- ---------

        --------------------------- -------

        -------------------------- -----
    ---

---

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66f5346fc5c563ced5707b17


猜你喜欢

  • Vue.js 如何在 typescript 中使用

    Vue.js 如何在 TypeScript 中使用 在现代前端开发中,Vue.js 是一个非常受欢迎的框架,它极具灵活性和可扩展性,是构建复杂应用程序的完美工具。而 TypeScript 则是一个强类...

    2 个月前
  • 用 Redux 实现异步流程控制

    在现代的 Web 应用程序中,异步流程控制变得越来越重要,因为它们会不停地拉取、更新和保存数据。Redux 是为 JavaScript 应用程序开发而创建的一个流行的状态容器。

    2 个月前
  • 使用 Hapi 和 Sails.js 构建 API

    简介 在现代 Web 开发中,API 是一个重要的组成部分,因为它是不同平台之间交互和数据共享的桥梁。使用 Node.js 和相应的框架可以轻松地搭建起一个高效、稳定的 API。

    2 个月前
  • 在 Deno 中使用 TypeScript 遇到问题?

    TypeScript 是一种由 Microsoft 开发的开源编程语言,它是 JavaScript 的超集,可以编译成纯 JavaScript 代码。TypeScript 具有静态类型检查和更好的代码...

    2 个月前
  • 使用 Gulp 自动化响应式设计的实践经验分享

    前言 现今互联网时代,距离移动化设备普及已经不远了。而对于前端开发者而言,保证网站响应式布局适配性,优化性能,提高开发效率已经成为必备的技能之一。在众多的前端工具中,Gulp 是一种非常流行的自动化构...

    2 个月前
  • Sequelize 单元测试的最佳实践

    在前端开发中,Sequelize 是一个常用的ORM(对象关系映射)库,它提供了一种易于使用的编程接口,用于在JavaScript应用程序中操作数据库。但是,在编写Sequelize应用程序时,你可能...

    2 个月前
  • Serverless 开发实践中的资源优化技巧

    随着云计算技术的成熟和普及,Serverless 作为一种新的应用开发和部署方式,正在逐渐受到开发者的关注和热捧。Serverless 架构的核心理念是将应用的运行与管理交给云服务商,极大地减轻了开发...

    2 个月前
  • ES10 的 for await...of 语句

    在 JavaScript 中,循环是一项非常常见的操作。尤其对于前端应用程序而言,循环操作更显得尤为重要。但是对于异步的操作,循环引起的问题会变得更加突出。ES10 引入了 for await...o...

    2 个月前
  • Fastify 框架中的错误处理与成功回调

    Fastify 是一个高度注重性能的 Node.js Web 框架之一,它的设计目标是为 Web 开发者提供一个快速创建 HTTP 服务的工具,同时保持低延迟和高效能。

    2 个月前
  • 如何使用 ES9 扩展的正则表达式方法

    如何使用 ES9 扩展的正则表达式方法 正则表达式是在前端开发中广泛使用的一个强大工具,可以用于匹配、替换、验证等多种操作。ES9 扩展了正则表达式的功能,使其更加灵活和强大。

    2 个月前
  • RESTful API 如何限制请求次数 / 秒?

    在开发 RESTful API 的时候,我们需要考虑到对请求的限制,防止意外的请求次数过多导致服务器负载过高,甚至导致服务器崩溃。本文将介绍一些如何限制 RESTful API 请求次数的方法。

    2 个月前
  • React中的Immutable数据结构及使用场景

    在React中,props和state是非常重要的状态管理工具。但是,由于React的数据是可变的,当状态改变时,React将重新渲染整个组件树。这会对性能产生负面影响。

    2 个月前
  • Web Components 中如何使用 React

    Web Components 是一种基于现有 Web 标准的技术,能够让开发者将 HTML、CSS、JavaScript 封装到自定义的、可重用的组件中。 React 是一个用于构建用户界面的 Jav...

    2 个月前
  • 如何使用 Babel 将 ES6 转换为 ES5

    JavaScript ES6 是一份于2015发布的 ECMAScript 标准,它为 JavaScript 带来了类,模板字面量,箭头函数表达式,解构赋值等许多有用的特性。

    2 个月前
  • 移动端 APP 的无障碍开发心得

    无障碍开发是指网站和应用程序的设计和开发,以确保用户无论是身体上还是认知上的限制,都能够方便地访问和使用,而不产生任何障碍。在移动应用程序中,无障碍开发也不可忽视。

    2 个月前
  • Docker 容器备份与恢复

    随着云计算、大数据、人工智能等技术的发展,容器化技术(Container)成为了云原生架构的基石之一,而 Docker 则成为了最流行的容器化技术之一。随着 Docker 的普及,如何做好容器的备份与...

    2 个月前
  • ES7 新增的 JavaScript 操作符

    随着 JavaScript 的不断发展,不断有新特性加入。ES7 引入了许多新的特性,包括一些新的操作符,这些操作符可以让我们更加方便地表达我们的意图,使我们的代码更加简洁和易于理解。

    2 个月前
  • Serverless 应用的自动化测试实战指南

    Serverless 架构的兴起,使得开发人员能够更方便地通过云服务提供商来构建和部署应用程序,同时无需考虑使用和管理虚拟机或服务器。Serverless 也使得自动化测试变得更加容易,因为开发人员不...

    2 个月前
  • Fastify 框架中集成 Swagger

    Swagger 是一个广为使用的开源框架,它可以帮助我们快速地设计、构建、文档化和测试 Web API。Fastify 是近年来非常流行的一种 Node.js 框架,它提供了快速和低开销的 Web 应...

    2 个月前
  • 在 Angular 中使用 NgModule 来管理模块

    随着项目的规模越来越大,我们需要使用模块来将应用程序分解成更小、更易于管理的部分。在 Angular 中,我们使用 NgModule 来管理模块。本文将介绍什么是 NgModule,如何使用 NgMo...

    2 个月前

相关推荐

    暂无文章