【问题标题】:Am I correct about .toFixed() and decimals?我对 .toFixed() 和小数是否正确?
【发布时间】:2021-07-02 18:41:24
【问题描述】:

我举了一个使用 .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 , 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,但想知道是否有人已经弄清楚了。

【问题讨论】:

  • @SuperDJ 我没有看到关于如果参数有小数部分会发生什么的解释。
  • 你指的是“toFixed()返回一个字符串表示numObj不使用指数表示法并且在小数点后正好有digits数字”? @SuperDJ

标签: javascript arrays function math tofixed


【解决方案1】:

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

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

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

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

也表示可以使用非数字:

const n = 3;

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

【讨论】:

  • 非常感谢!我过于简单化了,因为我部分忘记了。大声笑
  • @Banana 你是对的。我只是添加了有关转换的额外信息,部分是为了完整性,也因为否则答案会太短。绝大多数时间.toFixed() 将使用数字作为参数调用,因此您的解释是有道理的。细节并不那么重要,除非是在极端情况下。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    只是一个演示 .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))

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 2015-02-13
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多