js精度问题之bignumber.jsdecimal.js的基本使用

news2024/10/2 1:39:21

一、背景

JavaScript中存在精度缺失问题
在这里插入图片描述
为什么?

主要是由于浮点数的表示方式以及计算机的二进制运算原理导致的

JavaScript使用IEEE 754标准定义了浮点数的表示和计算规则。在这种表示方式中,浮点数由符号位、指数位和尾数位组成。尾数位的长度是固定的,一般为53位。但是,无论是整数还是小数,都需要通过二进制表示来存储,而不是十进制。这就导致了某些十进制小数在二进制表示中是无限循环的,因此无法完全精确地表示。

例如,0.1这个十进制小数在二进制中是无限循环的,无法准确表示。因此,在进行计算时,可能会出现舍入误差。多次的舍入误差累积起来就会导致精度缺失问题。

此外,JavaScript中的数值计算是通过二进制进行的,而不是十进制。由于二进制和十进制之间的转换存在精度限制,导致一些十进制的小数无法完全准确地转换为二进制,进而引发精度缺失。

为了解决这个问题,可以使用一些特殊的库或技术,如BigNumber.jsDecimal.js,来处理大数和小数运算,以提高精度和准确性。另外,在涉及到金额计算等需要高精度的场景中,可以将数值转换为整数进行计算,然后再进行必要的除法或格式化操作,以减少精度缺失的影响。

二、Decimal

1、decimal介绍

decimal.js文档地址:decimal.js

decimal.js是使用二进制来计算的,所以可以更好地实现格化式数学运算,对数字进行高精度处理;使用decimal类型处理数据可以保证数据计算更为精确,还可以节省储存空间。
在这里插入图片描述
这里的精度是根据有效数字而不是小数位来指定的,并且所有计算都四舍五入到精度(类似于 Python 的十进制模块),而不仅仅是涉及除法的计算

2、使用方法

安装

npm install --save decimal.js

页面引入

import { Decimal } from 'decimal.js'

加减乘除


const a = 2.998;
const b = 8.035;
// 加法
let c = new Decimal(a).add(new Decimal(b)) 
// 减法
let d = new Decimal(a).sub(new Decimal(b))
// 乘法
let e = new Decimal(a).mul(new Decimal(b))
// 除法
let f = new Decimal(a).div(new Decimal(b))
const a = 0.00002
const b = 0.00001
this.aaa = Decimal(a).add(Decimal(b))
console.log(this.aaa)

打印后
在这里插入图片描述

3、decimal.js函数封装

// 引入 Decimal.js 库
const Decimal = require('decimal.js');

// 封装加法函数
function add(num1, num2) {
  const decimal1 = new Decimal(num1);
  const decimal2 = new Decimal(num2);
  return decimal1.plus(decimal2).toString();
}

// 封装减法函数
function subtract(num1, num2) {
  const decimal1 = new Decimal(num1);
  const decimal2 = new Decimal(num2);
  return decimal1.minus(decimal2).toString();
}

// 封装乘法函数
function multiply(num1, num2) {
  const decimal1 = new Decimal(num1);
  const decimal2 = new Decimal(num2);
  return decimal1.times(decimal2).toString();
}

// 封装除法函数
function divide(num1, num2) {
  const decimal1 = new Decimal(num1);
  const decimal2 = new Decimal(num2);
  return decimal1.dividedBy(decimal2).toString();
}

// 使用示例
console.log(add('0.1', '0.2'));       // 输出:0.3
console.log(subtract('1.5', '0.8'));  // 输出:0.7
console.log(multiply('2.5', '1.2'));  // 输出:3
console.log(divide('6', '2'));        // 输出:3

三、Bignumber

1、bignumber介绍

bignumber.js文档地址:bignumber.js
在这里插入图片描述

2、使用方法

npm install bignumber.js
import BigNumber from "bignumber.js"
  • 加法 .plus(n [, base]) ⇒ BigNumber
  • 减法 .minus(n [, base]) ⇒ BigNumber
  • 乘法 .times(n [, base]) ⇒ BigNumber
  • 除法 .div(n [, base]) ⇒ BigNumber
  • 取模/取余: .mod(n [, base])
  • 指数运算: .pow(n [, m]) ⇒ BigNumber
  • 开平方:.sqrt() ⇒ BigNumber
  • 比较大小: .comparedTo(n [, base]) ⇒ number
  • 精度调整 .dp([dp [, rm]]) ⇒ BigNumber|number
  • 取整:.integerValue([rm]) ⇒ BigNumber
  • 有效数字 .sd([d [, rm]]) ⇒ BigNumber|number
  • 保留小数位数 .toFixed([dp [, rm]]) ⇒ string
let x = 6.2000, y = 3.10, z = 9;
console.log('9999--plus---',BigNumber(0.7).plus(x).plus(y).toString());  // 10
console.log('9999--minus---',BigNumber(x).minus(2).toString());  // 4.2
console.log('9999--times---',BigNumber(x).times(10).toString());  // 62
console.log('9999--div---',BigNumber(x).div(y).toString());  // 2
console.log('9999--mod---',BigNumber(x).mod(y).toString());  // 0
console.log('9999--pow---',BigNumber(x).pow(-2).toString());  // 0.0260145681581685744
console.log('9999--sqrt---',BigNumber(z).sqrt().toString());  // 3
console.log('9999--toFixed---',BigNumber(x).toFixed(1).toString());  // 6.2
console.log('9999--integerValue---',BigNumber(x).integerValue(1).toString());  // 6
console.log('9999--sd---',BigNumber(x).sd().toString());  // 2
console.log('9999--comparedTo---',BigNumber(x).comparedTo(y).toString());  //1, 1为大于,-1为小于,0为等于

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

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

相关文章

智慧高校IT智能运维方案

当前高校网络已成为每个学校必备的信息基础设施,也成了学校提高教学、科研及管理水平的重要途径和手段。随着信息化发展,高校网络建设逐步走向数字化、智慧化,传统的人力巡检、运维逐渐难以支撑高校校园稳定运行。因此,如何在有限…

半导体芯片封装工艺流程,芯片定制封装技术

当我们购买电子产品时,比如手机、电视或计算机,这些设备内部都有一个重要的组成部分,那就是半导体芯片。半导体芯片是由许多微小的电子元件组成的,为了保护和使用这些芯片,它们需要经过一个被称为封装的工艺流程。下面…

EasyRecovery16免费版电脑数据恢复工具

EasyRecovery是一款优质的数据恢复软件,Windows和Mac两个平台都可以运行。可恢复电脑、相机、移动硬盘、U盘、SD卡、内存卡、光盘以及本地存储的电子邮件等数据。同时支持100多种不同格式的文件恢复。EasyRecovery开发了个人版、专业版和企业版三重安装包&#xff0…

想要财务自由

*近日,有调查称“大概五分之一的年轻人存款在一万元以内。10万元存款是一个“坎”,存款超过10万就会超过53.7%的人。”“年轻人”“存款”两个词碰撞在一起,引来了广泛的关注和讨论。你认为年轻人存款难吗?可以从以下几个角度发表…

MapBox 实现自定义地图样式配置(包含本地静态引入)

Mapbox 官方提供了非常多的样式的底图,但是有的时候我们想要自己定义地图的样式基调,比如我们想看到这种样式的地图: 这就需要我们要有自己配置地图的能力了。 那么接下来我们说说怎么做。 首先我们还是登录 mapbox 的官网,找到样式配置的页面,这里直接给大家链接: A…

软件外包开发测试工具

软件测试是软件项目中非常重要的一个环节,在软件项目上线前必须要将问题测出来,否则上线后出现大量问题不但可能引起经济损失,而且也会失去客户的信任。今天和大家分享软件测试中常用的一些工具,希望对大家有所帮助。北京木奇移动…

系列六、Typora下载安装

一、下载 链接:https://pan.baidu.com/s/1c_OMBN_MdWi6-PjKjtcXPg?pwdyyds 提取码:yyds 二、安装 选择安装目录,直接下一步,下一步...即可,例如

SpringBoot01:认识并构建SpringBoot项目

目录 一、Spring Boot简介 1、回顾什么是Spring? 2、Spring是如何简化java开发的? 3、什么是SpringBoot? 3.1、什么是SpringBoot呢? 3.2、所有技术框架的发展似乎都遵循一条主线规律 3.3、SpringBoot开发背景 3.4、Spring…

聊一聊布隆过滤器

布隆过滤器是一个精巧而且经典的数据结构。 你可能没想到:RocketMQ、 Hbase 、Cassandra 、LevelDB 、RocksDB 这些知名项目中都有布隆过滤器的身影。 对于后端程序员来讲,学习和理解布隆过滤器有很大的必要性。下面,一起看一看布隆过滤器的…

智能客服外包服务在医药行业的应用

随着科技的不断进步,智能客服已经在各个行业得到了广泛应用,医药行业也不例外。那么,智能客服在医药行业中又有哪些应用呢?让我们一起来看看吧。 医药行业作为一个高度专业化且具有广泛需求的行业,每天都会涉及到大量…

10个免费PDF转PPT方法,请收好以备不时之需!

众所周知,PDF(便携式文档格式)文件广泛用于交换各种信息,包括文本、图像和图形。但有时,您可能想将 PDF 文件转换为其他格式,例如 PowerPoint。在本文中,我们将讨论 10 种将 PDF 转换为 PPT 的免…

6-js基础-2

JavaScript 基础 - 2 理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力 类型转换语句综合案例 今日重点单词: 类型转换 类型转换:把一种数据类型转换成另外一种数据类型 为…

快速搭建 Nuxt2 项目

文章目录 01 Nuxt 能提供哪些功能?有什么益处?02 快速搭建项目2.1 安装 create-nuxt-app 脚手架工具2.2 使用脚手架搭建项目 01 Nuxt 能提供哪些功能?有什么益处? 服务端渲染:Nuxt 是基于 Vue.js 的 服务端渲染 框架&…

文献学习-联合抽取-Joint entity and relation extraction based on a hybrid neural network

目录 1、Introduction 2、Related works 2.1 Named entity recognition 2.2 Relation classification 2.3 Joint entity and relation extraction 2.4 LSTM and CNN models On NLP 3、Our method 3.1 Bidirectional LSTM encoding layer 3.2 Named entity recogniton …

OpenStack(1)--创建实例

目录 一、上传镜像 1.1 新建目录 1.2 上传至glance 1.3 查看镜像 二、新建实例 2.1 获取秘钥 2.2 新建实例 2.3 新建实例admin-vm 2.4 获取实例VNC的url 2.5 nova常用命令 一、上传镜像 1.1 新建目录 上传名为cirros-0.3.4-x86_64-disk.img的Linux测试镜像&#xf…

Clock Rules(C Rules)

scan clocks的规则检查确保它们被正确的定义和操作。可以选择任意时钟规则检查的handling为error、warning、not或ignore。 Clock Terminology 时钟规则信息包含两个重复发生的概念,为了更好地使用这些信息,应该理解以下概念。 Clock Signals 如果一个信号能够改变一个se…

unity发布apk获取读写权限

实测版本:unity2019 操作:1.修改Manifest文件 2.在代码中直接调用API代码设置(可能不用这一步) Mac系统:Unity.app同级目录: PlaybackEngines/AndroidPlayer/Apk/ Win系统:Unity安装目录下…

5-响应式

01-媒体查询 基本写法 max-width:最大宽度(小于等于)min-width:最小宽度(大于等于) 书写顺序 min-width(从小到大)max-width(从大到小) 案例-左侧隐藏 需…

measure 一维测量 Metrology 二维测量

1维测量就是测长度,一个物体的长度。 2维测量就是在2维空间上测量,圆和矩形。 gen_measure_rectangle2 (TmpCtrl_Row, TmpCtrl_Column, TmpCtrl_Phi, TmpCtrl_Len1, TmpCtrl_Len2, 2464, 2056, nearest_neighbor, MsrHandle_Measure_01_0) * Measure 01:…

ChatGPT 实战:快速了解一个新领域

前段时间在社区里看到有人在分享:如何用 ChatGPT 麦肯锡方法论洞察一个行业,感觉这个方法在陌生行业的研究上很有帮助,同时我也一直好奇,投资经理在一两周的时间里如何快速了解一个新领域并做出投资决策的。先解决你的第一个疑问…