问题描述
我举了一个例子,将 .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))