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.00etc. так что это должна быть строка.
вы можете просто использовать"+", чтобы преобразовать результат в число.
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