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

问题描述

我举了一个例子,将 .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);
console.log("After using .toFixed(2) : " + bananaFixed + '\n');
};

bananaDivision();

他们理解并遵循了没有问题。 然后他们问我 - “如果我们在 .toFixed 中放一个小数会怎样?” 所以我跑了:

const bananaX = 9;
const bananaY = 2.9768;
bananaArray = [bananaX,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,但想知道是否有人已经弄清楚了。

解决方法

我将其解释为 .toFixed 正在查看 () 中的第一个数字并且忽略小数。

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

为了完全正确,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))