Я прав насчет .toFixed() и десятичных знаков?

#javascript #arrays #function #math #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 , 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() , чтобы он действительно использовал десятичные дроби? Я экспериментирую с банкоматом, но хотел бы знать, понял ли это кто-нибудь уже.

Комментарии:

1. вы смотрели какие-нибудь документы developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ?

2. @SuperDJ Я не вижу там объяснения того, что происходит, если аргумент имеет дробную часть.

3.Вы имеете в виду « toFixed() возвращает строковое представление, numObj которое не использует экспоненциальную нотацию и содержит ровно digits цифры после десятичного знака» ? @Суперджей

Ответ №1:

Я объяснил это так .toFixed смотрит на первое число в () и что десятичные дроби игнорируются.

Это было бы правильно. По сути, именно это и происходит.

Для полной корректности входные toFixed() данные будут преобразованы в целое число. В спецификации указано, что аргумент сначала должен быть преобразован в число — NaN будет преобразован в ноль. Числа с дробной частью будут округлены в меньшую сторону.

Это означает, что если вы передадите любое число, вы, по сути, получите его целочисленную часть.

Это также означает, что можно использовать не-числа:

 const n = 3;

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

Комментарии:

1. Большое вам спасибо! Я слишком упрощал, потому что частично забыл. лол

2. @Банан, ты был прав. Я просто добавил дополнительную информацию о преобразовании частично для полноты, а также потому, что в противном случае ответ был бы слишком коротким. В подавляющем большинстве случаев .toFixed() в качестве аргумента будет называться число, поэтому ваше объяснение имеет смысл. Детали не так важны, за исключением крайних случаев.

Ответ №2:

Вы близки, так как toFixed() ожидает целое число, которое будет обрабатывать преобразование десятичных чисел, прежде чем делать что-либо еще. Для этого он использует функцию toIntegerOrInfinity (), которая сама использует функцию floor (), поэтому число всегда округляется в меньшую сторону.

Большинство Javascript неявно обрабатывает преобразование типов, поэтому это то, что вы действительно должны хорошо понимать, если не хотите столкнуться с проблемами. Есть серия бесплатных книг, которая очень хорошо объясняет эту концепцию и множество других важных знаний о Javascript, она называется «Вы еще не знаете JS«.

Ответ №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))