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

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);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HackTheBox-Machines--Sense

Popcorn 测试过程 1 信息收集 服务器开启80、443端口 80端口 访问 80 跳转到 443 – https://10.129.196.51/ ,该页面是 pfSense 登录界面,默认密码是: admin/pfSense,使用默认账号密码登录失败 目录扫描 ./gobuster dir -u htt…

安卓六种页面加载优化方案对比总结

根据工作经验,笔者提炼了六种页面加载优化方式,按照业务与非业务,将六种加载方式分为两类: 业务类 控制业务与UI的执行顺序、控制多业务之间的执行顺序 ①预加载:是指在进入页面之前,提前获得页面所需得数据…

emp.dll文件丢失要怎么解决?荒野大镖客emp.dll修复方法分享

软件运行过程中经常遇到各种技术问题,其中之一就是动态链接库(DLL)文件丢失的现象。DLL文件是Windows操作系统中一个重要的组件,它包含运行多个应用程序所需要的代码和数据。因此,一个丢失的DLL文件,如“em…

uniapp 添加字体ttf

效果图如下 一、逻辑概述 在uniapp中使用字体,一共分成两种情况,一种是普通vue页面,一种是nvue页面引入字体。。 1.vue页面引入字体需要如下步骤 1. 先选择下载一种字体:字体格式一般为 ttf后缀名 黄凯桦律师手写体免费下载和在线…

JVM优化之垃圾收集器

JVM优化之垃圾收集器 Serial收集器Parallel Scavenge收集器ParNew收集器 如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。 没有最好的垃圾收集器,只有根据具体应用场景选择适合自己的垃圾收集器。 Serial收集器 #使用方…

代码审计(工具Fortify 、Seay审计系统安装及漏洞验证)

源代码审计 代码安全测试简介 代码安全测试是从安全的角度对代码进行的安全测试评估。(白盒测试;可看到源代码) 结合丰富的安全知识、编程经验、测试技术,利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷&#xf…

如何安装使用秋叶comfyui整合包,手把手详细教程(文末附安装包)

B 站的秋叶大佬在 1 月份就已经发布了 comfy ui 的整合包。用户将压缩包下载后,能够一键启动 comfy ui。其便利性与之前的 webui 整合包如出一辙。然而在整合包下载完成后,新手或许会遭遇插件以及模型缺失的情况,同时也不清楚该如何运行工作流…

HackTheBox-Machines--Popcorn

文章目录 0x01 端口扫描0x02 测试思路2.1 80端口测试 0x03 /torrent 目录文件上传测试0x04 权限提升 Popcorn 测试过程 0x01 端口扫描 (base) gryphonwsdl ~ %nmap -sC -sV 10.129.138.22 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:22 CST Nmap scan report …

用任务监听RTOS各任务的运行状态

使用rtos时内存对于单片机来说总是非常抠搜的。 任务分配多了浪费,少了跑不动。 最近看到这个监听任务还是很好用的。 废话不多说。开始操作 第一步在配置文件中打开这几个宏 #define configUSE_TRACE_FACILITY 1 /*为1时启用可视化跟踪调试*/ #define conf…

清风雅致·林曦老师的中国画美育直播课 你想了解的都在这里

大家期待已久的《清风雅致林曦老师的中国画美育直播课》开启报名啦~这个夏天,林曦老师将带你画完十幅重要的册页图,明代杜琼的《南村别墅图》。在此期间,暄桐教室除了收到了大家的“心心念念”和“满怀期待”,还有一连串“小问号”…

QT软件界面的设计与启动方法

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、Q T界面设计的重要性 二、QT软件的启动与配置 三、QT软件的启动路径设置 四、QT软件启…

[Redis]List类型

列表类型来存储多个有序的字符串,a、b、c、d、e 五个元素从左到右组成了一个有序的列表,列表中的每个字符串称为元素,一个列表最多可以存储个元素。在 Redis 中,可以对列表两端插入(push)和弹出&#xff08…

SRS介绍及环境搭建

1.SRS简介 SRS(Simple Real-Time Media Server)是一个开源的流媒体服务器,它支持多种流媒体协议,包括RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等57。SRS主要应用于直播、视频会议等场景,提供实时音视频服…

Java—认识异常

1. 异常的概念与体系结构 1.1 异常的概念 在生活中,一个人表情痛苦,出于关心,可能会问:你是不是生病了,需要我陪你去看医生吗? 在程序中也是一样,程序猿是一帮办事严谨、追求完美的高科技人才…

数据结构排序算法之直接插入排序与希尔排序【图文详解】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

光环云携手火山引擎共推全栈AI服务,赋能千行百业智能化转型,助力新质生产力发展

5月15日,2024春季火山引擎FORCE原动力大会在北京举办。作为智算云网综合服务提供商,光环云受邀出席大会,与火山引擎共同探索大模型时代下行业发展的新趋势。 会上,光环云数据有限公司正式与火山引擎签署生态伙伴合作协议&#xf…

JAVA应用服务器如何快速定位CPU问题

如果服务器上部署了多个Java站点服务和Java微服务,并且突然接收到CPU异常告警,我们需要逐步确定是哪个服务进程造成了CPU过载,接着是哪个线程,并最终定位到是哪段代码导致了这个问题 简要步骤如下: 步骤一、找到最耗C…

汇编概论和实践

一 汇编第一例 C代码 #include <stdio.h>int main() {printf("Hello, World!\n");return 0; }对应的汇编 .LC0:.string "Hello, World!"main:pushq %rbpmovq %rsp, %rbpleaq .LC0(%rip), %rdicall puts@PLTmovl $0, %eaxpopq %rbpret 二 CPU架构…

Android 车载 Audio 中 有关系统按键无声的问题排查小结

本文简单记录一下&#xff0c;车载中系统按键音的问题排查从 App --> FrameWork --> HAL层 的问题排查。 通过日志分析&#xff1a; AudioStreamOutSink 这个有数据写入到 HAL 中&#xff08;方式一&#xff09; 查看 dump 文件。&#xff08;方式二&#xff09; 先 …

C++语言·list链表(下)

还是之前说的&#xff0c;因为要写模板&#xff0c;为了避免链接出现问题&#xff0c;我们将所有内容都写到一个文件中去。首先就是画出链表的框架 链表本身只需要一个头节点就足以找到整条链表&#xff0c;而需要它拼接的节点我们再写一个模板。而我们知道list是一个带头双向循…