前端JavaScript处理小数精度问题的最佳实践教程

 更新时间:2024年10月22日 08:29:30   作者:零凌林  
在JavaScript开发过程中,小数精度问题是一个常见的难题,本文介绍了两种解决小数精度问题的方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言:

针对于小数精度问题,本次我们主要推荐两种方式,一种是简单的函数封装,一种是使用第三方库big.js。

方法一:

自封装函数搭配parseFloat和toFixed解决小数精度问题,仅适用于解决一般性小数精度问题,适用于项目中小数问题比较少的项目。 

  /**
  * @description: 处理小数精度
  * @param {*} value 需要格式化的数字
  * @param {*} fixedNum 保留的小数位数,默认为2
  * @param {*} multiple 乘数,默认为1
  * @return {*} 
  */
  export const handleDecimalPrecision = (value, fixedNum = 2, multiple = 1) => {
    return parseFloat((value * multiple).toFixed(fixedNum))
  }

测试用例:

(传倍数multiple 是为了展示成百分比,比如30%)

0.1 + 0.2 //0.30000000000000004
handleDecimalPrecision(0.1 + 0.2) //0.3

handleDecimalPrecision(0.1 + 0.2,1,100) //30 传倍数multiple 是为了展示成百分比,比如30%

方法二:

使用第三方库big.js 。适用于精度问题比较多的项目,长期性解决精度问题。以下我们将展示一些常见的使用范围的场景,其他的深冷需求可移步至官方文档查看。

big.js特点

  • 简单的API
  • 比Java的BigDecimal更快、更小、更易于使用
  • 复制JavaScript数字的toExponential、toFixed和toPrecision方法
  • 可以访问的十进制浮点格式存储值
  • 全面的文档和测试集
  • 没有依赖关系,相对独立
  • 仅使用ECMAScript 3,无兼容性问题

安装big.js

npm install big.js -S

引入big.js

<script>
import Big from 'big.js'
</script>

示例(以vue为例):

code:

<template>
  <div class="app-container">
    <div>小数精度</div>
    <div>未处理 : 0.1 + 0.2 = {{sum_orgin}}</div>
    <div>bigjs处理 : 0.1 + 0.2 = {{sum_bigjs}}</div>
  </div>
</template>

<script setup>
import Big from 'big.js'

const num1 = 0.1
const num2 = 0.2
const sum_orgin = num1.value + num2.value
const sum_bigjs = Big(num1.value).plus(Big(num2.value))
</script>

效果图:

创建Big number数据

const num1 = Big(0.1)
或者
const num2 = new Big(0.2)

加法精度问题处理 - plus

0.1 + 0.2 //0.30000000000000004
0.7 + 0.1 //0.7999999999999999
0.2 + 0.4 //0.6000000000000001

Big(0.1).plus(Big(0.2)) //0.3
Big(0.1).plus(Big(0.24)) //0.34

减法精度问题 - minus

0.3 - 0.2 //0.09999999999999998
1.5 - 1.2 //0.30000000000000004

Big(0.3).minus(Big(0.2)) //0.1

乘法精度问题 - times

19.9 * 100 //1989.9999999999998
0.8 * 3 //2.4000000000000004
35.41 * 100 //3540.9999999999995

Big(19.9).times(Big(100)) //1990

除法精度问题 - div

0.3 / 0.1 //2.9999999999999996
0.69 / 10 //0.06899999999999999
Big(0.3).div(Big(0.1)) //3

保留小数位数(四舍五入) - round

1 / 3 //0.3333333333333333
Big(1).div(Big(3)).round(3) //0.333

big.js运算符说明

运算符

说明

abs

取绝对值

cmp

compare的缩写,即比较函数

div

除法

eq

equal的缩写,即相等比较

gt

大于

gte

小于等于,e表示equal

lt

小于

lte

小于等于,e表示equal

minus

减法

mod

取余

plus

加法

pow

次方

prec

按精度舍入,参数表示整体位数

round

按精度舍入,参数表示小数点后位数

sqrt

开方

times

乘法

toExponential

转化为科学计数法,参数代表精度位数

toFied

补全位数,参数代表小数点后位数

toJSON/toString

转化为字符串

toPrecision

按指定有效位数展示,参数为有效位数

toNumber

转化为JavaScript中number类型

valueOf

包含负号(如果为负数或者-0)的字符串

bigjs官网文档 

总结

到此这篇关于前端JavaScript处理小数精度问题的文章就介绍到这了,更多相关前端JS处理小数精度内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于JavaScript实现轮播图效果

    基于JavaScript实现轮播图效果

    这篇文章主要为大家详细介绍了基于JavaScript实现轮播图效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-01-01
  • JS+canvas实现的五子棋游戏【人机大战版】

    JS+canvas实现的五子棋游戏【人机大战版】

    这篇文章主要介绍了JS+canvas实现的五子棋游戏,是采用比较强的AI实现的人机大战版游戏,涉及javascript结合HTML5实现图形绘制与人工智能相关操作技巧,需要的朋友可以参考下
    2017-07-07
  • JS替换字符串中空格方法

    JS替换字符串中空格方法

    这篇文章主要介绍了JS替换字符串中&nbsp方法,非常的简单实用,附上各种示例代码,有需要的小伙伴可以参考下。
    2015-04-04
  • 详解如何在JavaScript中使用装饰器

    详解如何在JavaScript中使用装饰器

    Decorator装饰器是ES7的时候提案的特性,目前处于Stage 3候选阶段(2022年10月)。装饰器简单来说就是修改类和类方法的语法糖,很多面向对象语言都有装饰器这一特性。本文就来说说如何在JavaScript中使用装饰器,需要的可以参考一下
    2022-10-10
  • node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能

    node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能

    这篇文章主要介绍了node.js+express+mySQL+ejs+bootstrop实现网站登录注册功能,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 解决layui 三级联动下拉框更新时回显的问题

    解决layui 三级联动下拉框更新时回显的问题

    今天小编就为大家分享一篇解决layui 三级联动下拉框更新时回显的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • js实现悬浮窗效果(支持拖动)

    js实现悬浮窗效果(支持拖动)

    本文主要介绍了js实现悬浮窗效果(支持拖动)的实例,具有很好的参考价值。下面跟着小编一起来看下吧
    2017-03-03
  • Vue自定义日历小控件使用方法详解

    Vue自定义日历小控件使用方法详解

    这篇文章主要为大家详细介绍了Vue自定义日历小控件使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • JavaScript实现网页图片等比例缩放实现代码及调用方式

    JavaScript实现网页图片等比例缩放实现代码及调用方式

    为了保证图片统一大小,直接设置图片大小又会导致图片拉伸,造成图片模糊,接下来将介绍的代码可以在图片加载完成后自动按比例调整图片大小,感兴趣的你可以参考下
    2013-02-02
  • JS实现在文本指定位置插入内容的简单示例

    JS实现在文本指定位置插入内容的简单示例

    下面小编就为大家分享一篇JS实现在文本指定位置插入内容的简单示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12

最新评论