解决js计算精度问题

问题

浮点数,常用的办法是四舍五入保留2位小数来解决。但是在向上、向下保留小数的时候,比如:0.1+0.2=0.30000000000000004,向上保留2位小数就变成了0.31。

大整数,在超出Number的最大安全整数时,计算也会存在精度问题。

原因

二进制最大尾数是52位,超出长度的部分计算就会丢失精度

解决办法

浮点数使用 js-big-decimal 计算浮点数

npm官网:js-big-decimal - npm

安装

npm i js-big-decimal -S

封装方法 /utils/big-decimal.js

import bigDecimal from "js-big-decimal";export default {// 声明state(number) {return new bigDecimal(number);},// 加add(number1, number2) {return bigDecimal.add(number1, number2);},// 减subtract(number1, number2) {return bigDecimal.subtract(number1, number2);},// 乘multiply(number1, number2) {return bigDecimal.multiply(number1, number2);},// 除// precision: 精确度,默认最多保留8位小数divide(number1, number2, precision = 8) {// 添加number,移除小数末尾多余0return Number(bigDecimal.divide(number1, number2, precision));},/*** 保留小数* length: 小数位长度,默认两位小数* option:选项,默认四舍五入*   HALF_EVEN 四舍五入*   CEILING 向上取*   DOWN 向下取*/round(number, length = 2, option = "HALF_EVEN") {const num = new bigDecimal(number);return num.round(length, bigDecimal.RoundingModes[option]).getValue();},// 绝对值abs(number) {return bigDecimal.abs(number);},// 向上取整ceil(number) {return bigDecimal.ceil(number);},// 向下取整floor(number) {return bigDecimal.floor(number);},
};

使用

import decimal from '@/utils/big-decimal';
decimal.add(0.1, 0.2);

大数使用bignumber.js

npm官网:bignumber.js - npm

安装

npm install bignumber.js -S

使用

a = new BigNumber(1011, 2)          // "11"
b = new BigNumber('zz.9', 36)       // "1295.25"
c = a.plus(b)                       // "1306.25"

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

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

相关文章

Tide Quencher 8WS-Amine,TQ8WS-胺,可用于特定荧光信号的检测

您好,欢迎来到新研之家 文章关键词:Tide Quencher 8WS Amine,TQ8WS amine,Tide Quencher 8WS NH2 ,TQ8WS NH2,Tide Quencher 8WS 胺,TQ8WS 胺 一、基本信息 产品简介:The fluores…

MySQL的基本查询(附案例)

目录 前言 Create(创建) 单行数据全列插入: 多行数据指定列插入: 插入否则更新: 替换: Retrieve(读取) SELECT 列: 全列查询: 指定列查询&#xff1a…

DMA技术在STM32中优化UART、SPI和I2C通信性能的研究与实现

DMA(Direct Memory Access,直接存储器访问)技术可以在STM32微控制器上优化UART、SPI和I2C等通信性能。DMA可以实现数据的高速传输,减轻CPU的负担,提高系统性能。在本篇文章中,我将探讨DMA技术在STM32中优化…

【数据开发】BI数据报表之数据可测试性设计与分析

文章目录 1、什么是BI&数据报表2、什么是可测试性3、数据测试与方法3.1 数据准确性与对比(重要)3.2 数据安全性 1、什么是BI&数据报表 数据报表是一种数据可视化工具 用于将数据以图表、表格和其他可视化形式呈现出来,以便用户可以…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

Linux的网络文件共享服务之FTP服务

一.存储类型 1.1 存储类型分为三种 直连式存储:Direct-Attached Storage,简称DAS 存储区域网络:Storage Area Network,简称SAN(可以使用空间,管理也是你来管理) 网络附加存储:Net…

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

十、Three场景实现多个物体的合并

Three场景实现多个物体的合并 目的 产品需求是让物体的光柱墙包含一个多边形的区域,二而我的多边形只能使用原型,方向,多边形。那么再研究的时候就需要将这些多边形合并成为一个形状,那么就行实现了。 原先的图形 如上图,是两个mesh组成的。首先寻找mesh合并的方法。 第…

算法练习-长度最小的子数组(思路+流程图+代码)

难度参考 难度:简单 分类:数组 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。 题目 给定一个含有个正整数的数组和一个正整数s,找…

redisson的延时队列机制简述

概述 业务中经常会遇到一些延迟执行的需求;通常想到的都是rabbitmq或者rocketmq的延迟消息; 但是系统中不一定集成了mq,但为了控制分布式下的并发,一般redis都是有集成的; redis的key过期监听那个时间不准确&#xff…

在 wsl-ubuntu 里通过 docker 启动 gpu-jupyter

在 wsl-ubuntu 里通过 docker 启动 gpu-jupyter 0. 背景1. 安装 docker-ce2. 安装 NVIDIA Container Toolkit3. 使用 nvidia-ctk 命令配置容器运行4. 通过 docker 运行 nvidia-smi5. 运行 gpu-jupyter6. 访问 gpu-jupyter7. 测试 gpu-jupyter 是否可以访问 cuda 0. 背景 今天突…

Mysql详细安装步骤

Linux 安装 MySQL【超详细版】 ​编辑 我叫BuGu    2023-05-11 16:48:10 发布 一、安装 MySQL 的准备工作 1. 查看系统版本 cat /etc/redhat-release2. 查看系统是否已经安装过 MySQL 查看是否安装了 MySQL rpm -qa | grep mysql查看是否有安装 mariadb,该软件与 MySQ…