integer最后一位四舍五入_JavaScript四舍五入的改进

前言

最近的两个项目中都有涉及到数据统计的部分,一般来说金额的数据都是选择保存2位小数,以前是使用JavaScript原生对象Number的toFixed方法。但是在测试中出现了3.235.toFixed(2) = 3.23的问题。查了下资料发现是因为浮点数的存储产生的问题。最后就自己封装了一个函数来解决这个问题。

1. toFixed失去准确性的原因

关于浮点数的存储我了解不多,这里推荐这个文章给需要的同学JavaScript 浮点数陷阱及解法。

2. 封装toFixed

2-1 实现思路

大体的思路是先分2部分,一是整数部分。整数部分不需要对值进行修改,为了和Number.toFixed保持一致,需要补上对应的0 (8.toFixed(2) => 8.00);

小数部分要做3个判断,当前小数后位数与要保存的位数进行比较。等于的直接返回,当前小数后位数小于要保存的位数就舍弃掉多余的部分。最后一种情况要针对正负数进行不同的处理,详情见下方代码。

注意:返回的结果都是字符串。

2-2 代码

let tofixed = (value, holdLen) => {

value = value.toString();

let dotIndex = value.indexOf(".");

//判断是否为整数

if (dotIndex === -1) {

//少几位就补几位0

let integerStr = ".";

for (let i = 0; i < holdLen; i++) {

integerStr = integerStr + '0';

}

return value + integerStr;

}

//获取小数点前后的字符串

let dotBefore = value.split(".")[0];

let dotAfter = value.split(".")[1];

//小数点后与要保留的位数进行判断出来

let result = "";

if (dotAfter.length === holdLen) {

result = value;

} else if (dotAfter.length < holdLen) {

let forlength = holdLen - dotAfter.length

//少几位就补几位0

for (let i = 0; i < forlength; i++) {

dotAfter = dotAfter + '0';

}

result = dotBefore + "." + dotAfter;

} else {

//获取到要四舍五入的位置后一个数字的值

let digit = value.substr(dotIndex + holdLen + 1, 1);

if (digit >= 5) {

let temp = Math.pow(10, 0 - holdLen);

//负数和正数的四舍五入判断

parseFloat(value) > 0 ? value = parseFloat(value) + temp : value = parseFloat(value) - temp;

value = value.toString();

}

result = value.substr(0, dotIndex + holdLen + 1);

}

return result;

}

console.log(tofixed(1.335, 2));

console.log(tofixed(2.1, 3));

console.log(tofixed(-8.546, 2));

console.log(tofixed(-9, 3));

//打印结果

"1.34"

"2.100"

"-8.55"

"-9.000"

我的处理办法很粗糙,希望各位多多给出意见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值