js四舍五入和计算精度问题处理

news2024/11/19 15:20:22

js四舍五入和计算精度问题处理

目录

    • js四舍五入和计算精度问题处理
      • 错误计算
      • 方法
      • 示例
      • 代码

js中加减乘除,部分数据会存在计算不准确。

错误计算

在这里插入图片描述

我使用的是big.js,基于big.js库封装了下工具方法,当然也可以用其他库,如mathjs/bignumber.js

方法

  • numberToFixed():四舍五入
  • numberMultiply:乘法
  • numberDiv():除法
  • numberPlus():加法
  • numberMinus():减法

示例

numberMultiply(0.2, 0.7) // 0.14 乘法
numberMultiply(0.2, ‘0.7’) // 0.14 可以是字符串类型的数字
numberMultiply(0.2, 0.7, 4, false) // ‘0.1400’

numberDiv(5, 2) // 2.5 除法
numberPlus(5, 2) // 7 加法
numberMinus(5, 2) // 3 减法

// 四舍五入
numberToFixed(12.225, 2) // 12.23
numberToFixed(12.225, 4, false) // ‘12.2250’

代码

numberUtil.ts

/**
 * @fileOverview 数值计算工具类
 * @date 2024-5-30
 */
import Big from 'big.js';
/**
 * 四舍五入
 * @param number 数字
 * @param precision 精度,不传则默认保留两位小数
 * @param isReturnNumber 是否返回数字类型,默认返回数字类型,否则返回字符串类型
 */
export function numberToFixed(number: number | string, precision = 2, isReturnNumber = true) {
  try {
    const bigNum = new Big(number).round(precision);
    // 直接返回数字类型
    if (isReturnNumber) return bigNum.toNumber().valueOf();
    // 返回字符串类型,不足位数用0补齐
    return bigNum.toFixed(precision).valueOf();
  } catch (e) {
    return '';
  }
}

type numberComputeType = 'times' | 'div' | 'plus' | 'minus';

/**
 * 数值计算
 * @param type
 * @param number1 数值1
 * @param number2 数值2
 * @param precision 精度,不传不处理精度
 * @param isReturnNumber 是否返回数字类型,默认返回数字类型,否则返回字符串类型
 */
function numberCompute(
  type: numberComputeType,
  number1: number | string,
  number2: number | string,
  precision: number | undefined,
  isReturnNumber: boolean | undefined
) {
  try {
    const bigNum = new Big(number1)[type](number2);
    const value = bigNum.toNumber().valueOf();
    if (precision === 0 || precision) return numberToFixed(value, precision, isReturnNumber);
    return value;
  } catch (e) {
    return '';
  }
}

/**
 * 数值计算
 * @params [数值1, 数值2, 精度?, 是否返回数字类型?]
 */
type numberComputeArgs = [string | number, string | number, number?, boolean?];

/**
 * 乘法
 * @param args 数值1, 数值2, 精度?, 是否返回数字类型?
 */
export const numberMultiply = (...args: numberComputeArgs) => numberCompute('times', ...args);

/**
 * 除法
 * @param args 数值1, 数值2, 精度?, 是否返回数字类型?
 */
export const numberDiv = (...args: numberComputeArgs) => numberCompute('div', ...args);
/**
 * 加法
 * @param args 数值1, 数值2, 精度?, 是否返回数字类型?
 */
export const numberPlus = (...args: numberComputeArgs) => numberCompute('plus', ...args);
/**
 * 减法
 * @param args 数值1, 数值2, 精度?, 是否返回数字类型?
 */
export const numberMinus = (...args: numberComputeArgs) => numberCompute('minus', ...args);

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

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

相关文章

【学习笔记】计算机组成原理(九+十)

控制单元的功能 文章目录 控制单元的功能9.1 微操作命令的分析9.1.1 取指周期9.1.2 间址周期9.1.3 执行周期9.1.4 中断周期 9.2 控制单元的功能9.2.1 控制单元的外特性9.2.2 控制信号举例9.2.3 多级时序系统9.2.4 控制方式 控制单元的设计10.1 组合逻辑设计10.1.1 组合逻辑控制…

04-树5 Root of AVL Tree(浙大数据结构PTA习题)

04-树5 Root of AVL Tree 分数 25 作者 陈越 单位 浙江大学 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more th…

Matlab|基于粒子群算法优化Kmeans聚类的居民用电行为分析

目录 主要内容 部分代码 结果一览 下载链接 主要内容 在我们研究电力系统优化调度模型的过程中,由于每天负荷和分布式电源出力随机性和不确定性,可能会优化出很多的结果,但是经济调度模型试图做到通用策略,同样的策…

Java-集合基础

集合 一、含义 集合是Java API所提供的一系列类,可以用于动态存放多个对象 (集合只能存对象)集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合中不能放基本数据类型,但可以…

WPF Binding对象

在WinForm中,我们要想对控件赋值,需要在后台代码中拿到控件对象进行操作,这种赋值形式,从根本上是无法实现界面与逻辑分离的。 在WPF中,微软引入了Binding对象,通过Binding,我们可以直接将控件与…

从零开始利用MATLAB进行FPGA设计(七)用ADC采集信号教程2

黑金的教程做的实在太拉闸了,于是自己摸索信号采集模块的使用方法。 ADC模块:AN9238 FPGA开发板:AX7020;Xilinx 公司的 Zynq7000 系列的芯片XC7Z020-2CLG400I,400引脚 FBGA 封装。 往期回顾: 从零开始利…

【易错题】数据统计补充习题(选择题 )#CDA Level 1

本文整理了数据统计相关的易错题,部分可作为备考CDA Level 1统计学部分的补充习题。来源:如荷学题库(CFDP第三部分) 1) 2) 3) 4) 5) 6) 7) 8&…

解决Mac ~/.bash_profile 配置的环境变量重启终端后失效问题

在Mac系统中,配置环境变量通常是在~/.bash_profile文件中进行。然而,有时会遇到配置的环境变量在重启终端后失效的问题。 解决办法: 在~/.zshrc文件最后或最前面,增加一行 source ~/.bash_profile

记一次netty客户端的开发

背景 近日要开发一个tcp客户端程序去对接上游厂商的数据源,决定使用netty去处理,由于很久没有开发过netty了,顺便学习记录下 netty搭建 考虑到我们需要多个client去对接server服务,所以我们定义一个公共的AbstractNettyClient父…

RAID技术迭代、原理对比、产品梳理(HCIA)

目录 一、RAID技术迭代 传统RAID LUN虚拟化2.0 工作原理: 块虚拟化2.0 为什么有RAID2.0? RAID2.0实现原理: RAID-TPRAID 7 华为RAID-TP技术 RAID的4种工作状态 RAID算法 普通RAID算法 华为动态RAID算法 保险箱盘(存掉…

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks 阅读笔记

这才是真正RAG,如果只是把检索得到结果放到prompt里面,可能够呛。 好久没有读paper了,最近因为有个小工作,来读一篇较早提出来RAG想法的文章吧。这篇文章是Facebook、伦敦大学学院以及纽约大学的研究者们搞出来的。文章首先指出&a…

8-异常与错误

8-异常与错误 1、简介2、异常处理2.1 抛出异常2.2 捕获异常2.3 匹配顺序 3、异常说明4、构造函数中的异常5、析构函数中的异常6、标准库异常 1、简介 在程序编码过程中难免会出现错误,主要有:语法错误、逻辑错误、功能错误等,当我们面对以上…

SpringBoot打war包并配置外部Tomcat运行

简介 由于其他原因,我们需要使用SpringBoot打成war包放在外部的Tomcat中运行,本文就以一个案例来说明从SpringBoot打war包到Tomcat配置并运行的全流程经过 环境 SpringBoot 2.6.15 Tomcat 8.5.100 JDK 1.8.0_281 Windows 正文 一、SpringBoot配置打war包 第一步&a…

echarts 图表不显示的问题

是这样的,点击详情,再点击统计,切换的时候就不会显示echarts图表,刚开始使用的是next Tick,没有使用定时器,后来加上了定时器就实现了如下所示: 代码是如下 const chartContainer ref(null); …

开发一个SDK(starter)

1.创建项目 将pom.xml中build删除掉

pikachu靶场(unsafe upfileupload(文件上传)通关教程)

目录 client check 1.在桌面新建一个文本文档 2.保存为.png格式 3.打开网站 4.按照图中操作 5.点击forward 6.访问 MIME type 1.新建一个php文件,里面写上 2.上传文件,就是我们保存的文件 3.打开抓包工具,点击开始上传 4.修改Conen…

服务器主板电池

一、什么是服务器纽扣电池? 服务器纽扣电池,也叫CMOS电池,是一种非常小型的电池,通常与服务器主板上的CMOS芯片相结合,用于储存BIOS设置、时钟和其他关键系统信息。这种电池的体积通常比一枚硬币还小,而且…

RT-DETR:端到端的实时Transformer检测模型(目标检测+跟踪)

博主一直一来做的都是基于Transformer的目标检测领域,相较于基于卷积的目标检测方法,如YOLO等,其检测速度一直为人诟病。 终于,RT-DETR横空出世,在取得高精度的同时,检测速度也大幅提升。 那么RT-DETR是如…

数据库(13)——DQL分组查询

语法 SELECT 字段列表 FROM 表名 [WHERE 条件] GROUP BY 分组字段名 [HAVING 分组后过滤条件] 示例 原始表: 根据性别分组并统计人数 select sex,count(*) from information group by sex; 根据性别分组,并求年龄的平均值:

2024抖音流量认知课:掌握流量底层逻辑,明白应该选择什么赛道 (43节课)

课程下载:https://download.csdn.net/download/m0_66047725/89360865 更多资源下载:关注我。 课程目录 01序言:拍前请看.mp4 02抖音建模逻辑1.mp4 03抖音标签逻辑2.mp4 04抖音推流逻辑3.mp4 05抖音起号逻辑4.mp4 06养号的意义.mp4 0…