#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))