Как я могу округлить число в JavaScript?.toFixed() возвращает строку?



Я что-то пропустил?



var someNumber = 123.456;
someNumber = someNumber.toFixed(2);
alert(typeof(someNumber));
//alerts string


почему тут .toFixed() возвратить строку?



Я хочу округлить число до 2 десятичных цифр.

571   11  

11 ответов:

он возвращает строку, потому что 0.1 и ее степени (которые используются для отображения десятичных дробей) не представимы (по крайней мере, не с полной точностью) в двоичных системах с плавающей запятой.

например, 0.1 действительно 0.1000000000000000055511151231257827021181583404541015625, и 0.01 действительно 0.01000000000000000020816681711721685132943093776702880859375. (Спасибо BigDecimal для доказательства моей точки зрения. :- P)

поэтому (отсутствует десятичная плавающая точка или rational number type), вывод его в виде строки-это единственный способ получить его обрезку с точностью, необходимой для отображения.

Number.prototype.toFixed предназначена для

Я решил эту проблему, изменив это:

someNumber = someNumber.toFixed(2)

...для этого:

someNumber = +someNumber.toFixed(2);

однако это приведет к преобразованию числа в строку и разбору его снова, что окажет значительное влияние на производительность. Если вы заботитесь о производительности или безопасности типа, проверьте другие ответы.

почему бы не использовать parseFloat?

var someNumber = 123.456;
someNumber = parseFloat(someNumber.toFixed(2));
alert(typeof(someNumber));
//alerts number

конечно, он возвращает строку. Если бы вы хотели округлить числовую переменную, вы бы использовали математику.круглый() вместо этого. Точка toFixed-это форматирование числа с фиксированным числом десятичных знаков для отображения пользователю.

Я решил его с преобразованием его обратно в число с помощью JavaScript Number() функции

var x = 2.2873424;
x = Number(x.toFixed(2));

что бы вы ожидали, что он вернется, когда он должен отформатировать число ? Если у вас есть номер, вы не можете почти ничего с ним сделать, потому что, например,2 == 2.0 == 2.00 etc. так что это должна быть строка.

вы можете просто использовать"+", чтобы преобразовать результат в число.

var x = 22.032423;
x = +x.toFixed(2); // x = 22.03

потому что его основное применение-это отображение чисел? Если вы хотите округлить числа, используйте Math.round() с соответствующими факторами.

а вот немного более функциональная версия ответа m93a предусмотрено.

const toFixedNumber = (toFixTo = 2, base = 10) => num => {
  const pow = Math.pow(base, toFixTo)
  return +(Math.round(num * pow) / pow)
}

const oneNumber = 10.12323223

const result1 = toFixedNumber(2)(oneNumber) // 10.12
const result2 = toFixedNumber(3)(oneNumber) // 10.123

// or using pipeline-operator
const result3 = oneNumber |> toFixedNumber(2) // 10.12

чтобы привести пример того, почему это должна быть строка:

Если вы форматируете 1.toFixed(2) вы получите '1.00'.

Это не то же самое, что 1, так как 1 не имеет 2 десятичных знаков.


Я знаю, что JavaScript-это не совсем производительность язык, но есть вероятность, что вы получите лучшую производительность для округления, если вы используете что-то вроде: roundedValue = математика.круглый(цена * 100) * 0.01

Comments

    Ничего не найдено.