我对 .toFixed() 和小数是否正确?

Am I correct about .toFixed() and decimals?

我举了一个使用 .tofixed() 与数学、函数和数组的例子,给一个初学者朋友,他在他的 class.

中回顾了这些主题

const bananaX = 9;
const bananaY = 2.9768;
bananaArray = [bananaX , bananaY];


console.log("X before array = " + bananaX);
console.log("Y before array = " + bananaY + '\n')
console.log("X,Y after array = " + bananaArray + '\n')
console.log("Value of X in array: " + bananaArray[0]+ '\n')
console.log("Value of Y in array: " + bananaArray[1]+ '\n')


function bananaDivision (bananaArray){
console.log("Value of X after function = " + bananaX);
console.log("Value of Y after function = " + bananaY + '\n')

let bananaDivided = Math.abs(bananaX/bananaY );
console.log (`X divided by Y = + ${bananaDivided}` + '\n')
let bananaFixed = bananaDivided.toFixed(2);
console.log("After using .toFixed(2) : " + bananaFixed + '\n');
};

bananaDivision();

他们理解并遵循没有问题。 然后他们问我——“如果我们在 .toFixed 中放一个小数呢?” 所以我 运行:

const bananaX = 9;
const bananaY = 2.9768;
bananaArray = [bananaX , bananaY];


console.log("X before array = " + bananaX);
console.log("Y before array = " + bananaY + '\n')
console.log("X,Y after array = " + bananaArray + '\n')
console.log("Value of X in array: " + bananaArray[0]+ '\n')
console.log("Value of Y in array: " + bananaArray[1]+ '\n')

function bananaDivision (bananaArray){
console.log("Value of X after function = " + bananaX);
console.log("Value of Y after function = " + bananaY + '\n')

let bananaDivided = Math.abs(bananaX/bananaY );
console.log (`X divided by Y = + ${bananaDivided}` + '\n')
let bananaFixed = bananaDivided.toFixed(2);
let bananaFixed1 = bananaDivided.toFixed(.69420);
let bananaFixed2 = bananaDivided.toFixed(1.69420);
console.log("After using .toFixed(2) : " + bananaFixed + '\n');
console.log("After using .toFixed(.69420) : " + bananaFixed1 + '\n');
console.log("After using .toFixed(1.69420) : " + bananaFixed2 + '\n');
};

bananaDivision();

我的解释是 .toFixed 正在查看 () 中的第一个数字,小数点被忽略。

我说的对吗?出于我自己的好奇,是否有一种疯狂的方法来打破 .toFixed() 以便它实际上使用小数?我正在试验 atm,但想知道是否有人已经弄明白了。

I explained it as that .toFixed is looking at the first number within the () and that the decimals are ignored.

这是正确的。本质上就是这样。

为了完全正确,toFixed() 的输入将被转换为整数。规范指出参数必须首先转换为数字 - NaN 将被转换为零。有小数部分的数字将向下舍入。

这意味着如果你传递任何数字,你基本上得到它的整数部分。

这也意味着可以使用非数字:

const n = 3;

console.log(n.toFixed("1e1")); // 1e1 scientific notation for 10

你很接近,因为 toFixed() 需要一个整数,它将在执行任何其他操作之前处理转换十进制数。它使用 toIntegerOrInfinity() 来做到这一点,它本身使用 floor() 所以数字总是向下舍入。

大多数 Javascript 隐式处理类型转换,因此如果您不想 运行 遇到问题,您应该真正理解它。有一个免费书籍系列很好地解释了这个概念和许多其他重要的 Javascript 知识,它叫做 You Don't Know JS Yet

只是演示 .tofixed 的工作原理 !!!!!!

function roundFloat(x, digits) {

const arr = x.toString().split(".")
  if (arr.length < 2) {
    return x
  }else if(arr[1] === ""){
  return arr[0]
  }else if(digits < 1){
  return arr[0]
  }

  const st = parseInt(x.toString().split(".")[1]);



  let add = false;
  const rudgt = digits
  const fX = parseInt(st.toString().split("")[rudgt]);

  fX > 5 ? add = true : add = false


  nFloat = parseInt(st.toString().split("").slice(0, rudgt).join(""))
  if (add) {
    nFloat += 1
  }
  const repeat0 = (() => {
    if (rudgt - st.toString().length < 0) {
      return 0
    }
    return rudgt - st.toString().length
  })()
  const output = x.toString().split(".")[0] + "." + nFloat.toString() + "0".repeat(repeat0);
  
  return output
}

console.log(roundFloat(1.200, 2))