首页 > 其他分享 >vue中使用decimal.js对前端数值类型进行高精度计算

vue中使用decimal.js对前端数值类型进行高精度计算

时间:2024-09-29 16:49:39浏览次数:8  
标签:vue decimal value js let new Decimal

需求背景:由于一些场景我们需要在前端JavaScript进行数值计算,且对精度要求比较严谨,而前端数值是浮点类型,直接使用计算可能会产生一系列的精度问题,常见的浮点运算问题,比如精度损失等;所以例如涉及到一些金额计算等,需要进行高精度处理。

解决方案:

(1)可以把数值计算部分逻辑交给后端接口来完成,但是需增加一次网络请求开销(比较适用于需同时请求后端接口的场景)。

(2)无需请求后端接口,数据计算部分逻辑完全由前端进行,使用一些高精度处理的第三方JS库,比如decimal.js等(这里主要介绍decimal.js库)

npm 或 yarn安装引用decimal.js库:

//npm安装
npm install --save decimal.js(低版本-v4 及以下)
或
npm install decimal.js(高版本-npm v5及以上版本中)

//yarn安装
yarn add decimal.js

//引入
//Node.js 
var Decimal = require('decimal.js')

//ES6 方式
import { Decimal } from 'decimal.js'

下面是一些decimal.js【加减乘除】计算的使用案例:

methods: {
  handleDecimalData() {
      //加法
      var a1 = 0.13
      var b1 = 0.25
      let c1 = new Decimal(a1).add(new Decimal(b1)) 
      console.log("加法运算 a1 + b1 =",a1 + b1)
      console.log("使用decimal.js a1 + b1 =",c1.toString())
      //减法
      var a2 = 1.0
      var b2 = 0.99
      let c2 = new Decimal(a2).sub(new Decimal(b2)) 
      console.log("减法运算 a2 - b2 =",a2 - b2)
      console.log("使用decimal.js a2 - b2 =",c2.toString())
      //乘法
      var a3 = 1.01
      var b3 = 1.02
      let c3 = new Decimal(a3).mul(new Decimal(b3)) 
      console.log("乘法运算 a3 * b3 = ", a3 * b3)
      console.log("使用decimal.js a3 * b3 = ",c3.toString())
      //除法
      var a4 = 0.033
      var b4 = 10
      let c4 = new Decimal(a4).div(new Decimal(b4)) 
      console.log("除法运算 a4 / b4 = ", a4 / b4)
      console.log("使用decimal.js a4 / b4 = ",c4.toString())
  }
} 

对计算结果的一些处理方法:

js//四舍五入保留2位小数
total() {
  let price = new Decimal(this.itemPrice);
  let quantity = new Decimal(this.quantity);
  let total = price.mul(quantity);
  return total.toDecimalPlaces(2,Decimal.ROUND_HALF_UP).toString();
}

//向上取整
let value = new Decimal('123.456');
let ceilValue = value.ceil();
console.log(ceilValue.toString()); // 输出 "124"

//向下取整
let value = new Decimal('123.456');
let floorValue = value.floor();
console.log(floorValue.toString()); // 输出 "123"

/*
  保留小数部分的取整
  如果你需要保留小数部分,可以使用 toDecimalPlaces 方法结合 rounding 参数来实现向上或向下取整。
*/

//向上取整保留2位小数
let value = new Decimal('123.456');
let ceilValue = value.toDecimalPlaces(2, Decimal.ROUND_CEIL);
console.log(ceilValue.toString()); // 输出 "123.46"

//向下取整保留2位小数
let value = new Decimal('123.456');
let floorValue = value.toDecimalPlaces(2, Decimal.ROUND_FLOOR);
console.log(floorValue.toString()); // 输出 "123.45"

/**
 * 格式化数值,添加千位分隔符
 * @param {具体value数值} value
 * @param {保留几位小数:默认为两位小数} decimals 
 * @param {舍入模式:默认为四舍五入} rounding 
 * @returns 
 */
export function formatNumber(value, decimals = 2,rounding=Decimal.ROUND_HALF_UP) {
  if(typeof value==='string' && value==''){
    return ''
  }

  if (!(value instanceof Decimal)) {
    value = new Decimal(value);
  }

  const parts = value.toDecimalPlaces(decimals,rounding).toString().split('.');
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  return parts.join('.');
}
//calcResult可以是字符串类型的数值
console.log(formatNumber(calcResult));

注意:

(1)最终计算结果最好不要转成.toNumber(),毕竟还是浮点类型,可以直接.toString()转成字符串来使用。

(2)还有这个.toFixed()这个四舍五入还是少用(有些场景结果是不对的),对于计算结果要求比较严谨的场景,还是使用decimal.js的api方法实现四舍五入等处理。

参考博文链接:https://www.cnblogs.com/morango/p/14555507.html#!comments

标签:vue,decimal,value,js,let,new,Decimal
From: https://www.cnblogs.com/hong01072/p/18440361

相关文章

  • 基于django+vue+Vue《大学计算机》课程思政资源共享平台【开题报告+程序+论文】-计算
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,高等教育领域正经历着深刻的变革。《大学计算机》作为培养大学生信息素养与计算思维能力的核心课程,其教学质量直接......
  • jsp冬奥会主题网站air40
    jsp冬奥会主题网站air40本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,新闻资讯,比赛信息,比赛项目,残奥会,排行榜开题报告内容一、项目背景与意义随着全球体育盛事——冬奥会的日益临近,构......
  • jsp东茂超市信息管理系统4ap8d
    jsp东茂超市信息管理系统4ap8d本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能员工,商品类型,货架信息,商品信息,进货记录,销售信息,商品盘点,盈利信息技术要求:   开发语言:JSP前端使用:HTML5......
  • jsp冬奥会志愿者报名系统l11a0
    jsp冬奥会志愿者报名系统l11a0本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表项目功能用户,比赛项目,报名信息,录取结果,风采专区,东奥运信息,类型开题报告内容一、项目背景与意义冬奥会作为全球最重要的......
  • vue快捷开发(组件的使用)
    可以写一个主界面的view,在左侧侧边栏加一个导航栏,通过导航栏的按钮点击来切换不同的界面,组件的使用小细节(1)在view代码中①在导航栏上面加上按钮,点击按钮实现组件的展示(此处的showContent就是在界面右侧展示出组件) ②在script中导入不同的内容组件 注意组件的导入方式......
  • 基于Java+Springboot+Vue开发的大学竞赛报名管理系统源码+开发文章1.3万字
    项目简介该项目是基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践......
  • C++中使用Qt实现JSON序列化与反序列化
    //File:JsonSerializer//Author:[email protected]//Creation:2024/09/29#ifndefJSON_SERIALIZER_H#defineJSON_SERIALIZER_H#include<QJsonDocument>#include<QJsonObject>#include<QJsonArray>#include<QJsonValue>#includ......
  • 大json字符串处理
    背景:当从API获取数据或与其他系统交换信息时。有时json字符串可能会非常庞大,以至于读取到内存中会导致内存溢出或者性能问题流式处理:如果JSON字符串过大,不适合一次性加载到内存中,可以考虑使用流式处理。例如,使用Jackson库的JsonParser,可以逐行解析JSON,从而避免一次性加载整个字......
  • springboot+vue+elementui大文件分片上传
    工具类方法:/***大文件分片上传*@paramfileName文件名*@paramfile文件*@paramfileKey文件key*@paramshardIndex当前分片下标*@paramshardTotal分片总量*/publicstaticvoidbigUpload(StringfileNam......
  • WPS JS宏单元格双击打勾
    一行代码,rg.Value2=就可以实现在任意单元格里输入等号后面的内容。如果想要在表格中加入限制,在规定范围内的单元格中随意输入。 rg.Column==限制了等号后面,输入的列rg.Cells!=限制单元格内容。rg.MergeCells==判断是否是合并单元格完整代码functionWorkbook_Sheet......