控制小数的四舍五入,以及不足小数位数时,是否自动补零

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 * 把Number四舍五入为指定小数位数的数字字符串(解决原toFixed四舍五入问题)
 * @param {number} [len=0] 保留小数位数
 * @param {boolean} [round=true] 是否四舍五入(默认进行四舍五入)
 * @param {boolean} [padding=true] 有效数字不足预设小数位数时是否后补0(默认后补)如:_toFixed(1.1,3,true,true) = "1.100"  ;   _toFixed(1.1,3,true,false) = "1.1"
 * @returns {string}
 * @example _toFixed(1.335,2);
*/
function _toFixed(num, len, round, padding) {
  num = Number(num);
  if (len < 0) {
    throw new RangeError("digits argument must be between 0 and 100");
  }
  let numStr = String(num), //数字转字符串
    pointIndex = numStr.indexOf("."), //小数点下标
    preNumIndex = pointIndex + len + 1; //保留位后一位数字下标
  if (numStr.includes("e") || pointIndex === -1) {
    //遇到科学表示法或整数,直接返回原生toFixed处理结果
    return num.toFixed(len);
  }
  let addZeroCount = len - (numStr.length - pointIndex - 1); //需补0的个数
  if (addZeroCount > 0) {
    numStr += "0".repeat(addZeroCount); //小数位不足后补0
  }
  let numCut = Math.abs(numStr.substring(0, preNumIndex)); //截取保留位(含)前的所有字符
  let res =
    (num < 0 ? "-" : "") +
    (round && numStr[preNumIndex] >= 5
      ? numCut + 1 / Math.pow(10, len)
      : numCut
    ).toFixed(len); //判断预期小数位后一位是否大于等于5,是则进位
  return padding ? res : String(Number(res));
}
console.log(_toFixed(123.456, 2, false, true), "是否四舍五入自我控制");

  

posted @   沁猿春  阅读(562)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示