toFixed四舍五入的问题

console.log(1.565.toFixed(2)) // 1.56
console.log(1.335.toFixed(2)) // 1.33

通过上述两行代码,发现5不会进位,具体原因如下图解释
toFixed它是一个四舍六入五成双的诡异的方法(也叫银行家算法),"四舍六入五成双"含义:对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:①5前为奇数,舍5入1;②5前为偶数,舍5不进。(0是偶数)
但是,发现在chorme下没有完全去遵循这个规律,或许它有自己的算法,但是毕竟它没有遵循通用的银行家算法,所以tofixed这个方法在涉及到金钱计算的业务中还是少用,最好别用,否则可能会出大问题!

解决方案(使用新方法替代toFixed)

1、通用方法里面添加此方法(index.js或者util.js或ruoyi.js)

/*
* num 需要处理的数据
* fixed 保留几位小数
*/
roundToFixed(num, fixed) {
  var pos = Math.pow(10, fixed),
      n = (num * pos).toFixed(2);
  n = Math.round(n) / pos;
  // 处理特殊情况:-0.000... 变成 -0
  n = n < 0 && n > -1e-10 ? 0 : n;
  return n.toFixed(fixed);
},

Math.pow 用于计算一个数的乘幂,该函数接受两个参数:底数和指数,返回底数的指数次方的结果。基本语法:Math.pow(base, exponent)
Math.round() 函数返回一个数字四舍五入后最接近的整数。
如果参数的小数部分大于 0.5,则舍入到相邻的绝对值更大的整数。如果参数的小数部分小于 0.5,则舍入到相邻的绝对值更小的整数。如果参数的小数部分恰好等于 0.5,则舍入到相邻的在正无穷(+∞)方向上的整数。注意,与很多其他语言中的round() 函数不同,Math.round() 并不总是舍入到远离 0 的方向(尤其是在负数的小数部分恰好等于 0.5 的情况下)。

2、main.js中引入

import { roundToFixed } from "@/utils/util";
// 注册全局方法
Vue.prototype.$roundToFixed = roundToFixed;

3、页面中使用

this.roundToFixed(1.565, 2) // 1.57
this.roundToFixed(1.335, 2) // 1.34
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容