关于toFixed四舍五入的精度问题

在日常使用toFixed的时候总会遇到一些奇奇怪怪的问题,经常会出现保留小数位数出现错误的时候,从网上搜索了一下,主流的说法是他们的算法是银行家舍入法,有兴趣大家可以自行百度。

比如:

复制代码
3.55.toFixed(1) // 结果为3.5

大概意思就是 3.55在toFixed看来它是3.5499999循环9,所以在保留一位小数的时候是3.5而不是3.6

有两种方法解决问题:

第一种就是使用插件:number-precision

复制代码
npm install number-precision --save

import NP from 'number-precision'

NP.round(3.55, 1);  // 3.6

其中number-precision还有许多解决关于js的精度问题

复制代码
console.log(0.1 + 0.2)  // 0.30000000000000004


NP.plus(0.1, 0.2)  // 0.3


// 其他用法 大家可以自行使用
NP.plus(num1, num2, num3, ...)   // num + num2 + num3
NP.minus(num1, num2, num3, ...)  // num1 - num2 - num3
NP.times(num1, num2, num3, ...)  // num1 * num2 * num3
NP.divide(num1, num2, num3, ...) // num1 / num2 / num3

第二种方法:自己封装

以下是从掘金上看大佬的写法:js精度丢失的问题,重新封装toFixed() - 掘金 (juejin.cn)

javascript 复制代码
export function toFixed(num, fixed = 2) {//fixed是小数保留的位数
  let numSplit = num.toString().split('.');
  if (numSplit.length == 1 || !numSplit[1][fixed] || numSplit[1][fixed] <= 4) {
    return num.toFixed(fixed);
  }
  numSplit[1] = +numSplit[1].substring(0, fixed) + 1 + '';
  if (numSplit[1].length > fixed) {
    numSplit[0] = +numSplit[0] + 1;
    numSplit[1] = numSplit[1].substring(1, fixed + 1);
  }
  return numSplit.join('.');
}
相关推荐
他是龙551几秒前
第29天:安全开发-JS应用&DOM树&加密编码库&断点调试&逆向分析&元素属性操作
开发语言·javascript·安全
和和和2 分钟前
前端应该知道的浏览器知识
前端·javascript
狗哥哥4 分钟前
前端基础数据中心:从混乱到统一的架构演进
前端·vue.js·架构
树深遇鹿8 分钟前
数据字典技术方案实战
前端·javascript·架构
爱吃大芒果16 分钟前
Flutter 基础组件详解:Text、Image、Button 使用技巧
开发语言·javascript·flutter·华为·ecmascript·harmonyos
大布布将军33 分钟前
一种名为“Webpack 配置工程师”的已故职业—— Vite 与“零配置”的快乐
前端·javascript·学习·程序人生·webpack·前端框架·学习方法
JosieBook35 分钟前
【Vue】02 Vue技术——搭建 Vue 开发框架:在VS Code中创建一个Vue项目
前端·javascript·vue.js
计算机学姐35 分钟前
基于Python的商场停车管理系统【2026最新】
开发语言·vue.js·后端·python·mysql·django·flask
科普瑞传感仪器41 分钟前
航空航天制造升级:机器人高精度力控打磨如何赋能复合材料加工?
java·前端·人工智能·机器人·无人机·制造
q_191328469542 分钟前
基于SpringBoot2+Vue2的宠物上门服务在线平台
java·vue.js·spring boot·mysql·宠物·计算机毕业设计·源码分享