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