JS 算法设计

问题描述

设计一个三七进位算法

问题出现的环境背景

根据四舍五入演变

相关代码

/**
* @num 原数据 例如:66.67 小数点后的位数不定(可以是0,1,2,3,等等),整数部分也不定(可以是1位或多位)
* @limit 小数点后多少位开始进位(>=1) 例如:2
* @return 进位后的结果
/
let threeSevenUp = (num, limit) => {
    //具体实现方式
    
    return ;
}

题目描述

三七进位是对小数点后多少位进行进位
例1:目标数据为有2位小数小数点后2位进行进位

66.60---->66.60
66.61---->66.60
66.62---->66.60

66.63---->66.65
66.64---->66.65
66.65---->66.65
66.66---->66.65
66.67---->66.65

66.68---->66.70
66.69---->66.70

66.99---->67.00

例2:目标数据为有3位小数小数点后3位进行进位

66.601---->66.600
66.611---->66.610
66.622---->66.620

66.633---->66.635
66.644---->66.645
66.655---->66.655
66.666---->66.665
66.677---->66.675

66.688---->66.690
66.699---->66.700

66.999---->67.000

温馨提示:
注意JS中的 0.1 + 0.2 != 0.3的情况

阅读 2k
2 个回答
let threeSevenUp = (price, mCarryLimit = 2) => {
    if (!price) return 0;
    let newPrice = price;
    priceArr = price.toString().split(".");
    const intNum = priceArr[0]; //整数部分
    const decimals = priceArr[1]; // 小数部分
    // 无小数部分-直接返回整数
    if (!decimals) {
      newPrice = intNum;
    } else {
      const slicedDecimals = decimals.slice(0, mCarryLimit); // 取mCarryLimit位小数部分
      // price 只有一位小数,但我们取 2位小数,这时就直接返回 【整数】 + 【一位小数部分】
      // 比如 price = 12.2  slicedDecimals.length = 1 mCarryLimit = 2
      if (slicedDecimals.length === mCarryLimit) {
        const lastBit = slicedDecimals.slice(-1) * 1; // 小数部分的最后一位
        const lastBeforeBit = slicedDecimals.substring(
          -1,
          slicedDecimals.length - 1
        ); //小数部分除最后一位的所有
        if (lastBit > 7 || lastBit < 3) {
          newPrice = ([intNum, slicedDecimals].join(".") * 1).toFixed(
            mCarryLimit - 1
          );
        } else {
          newPrice = [intNum, lastBeforeBit + 5].join(".");
        }
      } else {
        newPrice = [intNum, slicedDecimals].join(".");
      }
    }

    return newPrice * 1;
  };
let threeSevenUp2 = (num, position = 2) => {
    let numStr = num + "";
    let existReg = new RegExp("\\d+\\.\\d{" + position + ",}");
    if (
      isNaN(num) ||
      isNaN(position) ||
      !existReg.test(numStr) ||
      position <= 0
    )
      return num;
    let reg = new RegExp(`(\\d+\\.\\d{${position - 1}})(\\d)\\d*`);
    return +numStr.replace(reg, (a, a1, a2) => {
      let tailNum = +a2;
      return tailNum < 3
        ? `${a1}0`
        : tailNum > 7
        ? num.toFixed(position - 1)
        : `${a1}5`;
    });
  }
import assert from "assert";

/**
 * @num 原数据 例如:66.67 小数点后的位数不定(可以是0,1,2,3,等等),整数部分也不定(可以是1位或多位)
 * @limit 小数点后多少位开始进位(>=1) 例如:2
 * @return 进位后的结果
 */
function threeSevenUp(num, limit) {
  const power = Math.pow(10, limit - 1) * 2;
  return (Math.round(num * power) / power).toFixed(limit);
}

assert.equal(threeSevenUp(), "NaN");

assert.equal(threeSevenUp("66.60", 2), "66.60");
assert.equal(threeSevenUp("66.61", 2), "66.60");
assert.equal(threeSevenUp("66.62", 2), "66.60");
assert.equal(threeSevenUp("66.63", 2), "66.65");
assert.equal(threeSevenUp("66.64", 2), "66.65");
assert.equal(threeSevenUp("66.65", 2), "66.65");
assert.equal(threeSevenUp("66.66", 2), "66.65");
assert.equal(threeSevenUp("66.67", 2), "66.65");
assert.equal(threeSevenUp("66.68", 2), "66.70");
assert.equal(threeSevenUp("66.69", 2), "66.70");
assert.equal(threeSevenUp("66.99", 2), "67.00");

assert.equal(threeSevenUp("66.601", 3), "66.600");
assert.equal(threeSevenUp("66.611", 3), "66.610");
assert.equal(threeSevenUp("66.622", 3), "66.620");
assert.equal(threeSevenUp("66.633", 3), "66.635");
assert.equal(threeSevenUp("66.644", 3), "66.645");
assert.equal(threeSevenUp("66.655", 3), "66.655");
assert.equal(threeSevenUp("66.666", 3), "66.665");
assert.equal(threeSevenUp("66.677", 3), "66.675");
assert.equal(threeSevenUp("66.688", 3), "66.690");
assert.equal(threeSevenUp("66.699", 3), "66.700");
assert.equal(threeSevenUp("66.999", 3), "67.000");
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题