Ответ 1
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0
Здесь сценарий: я получаю .9999999999999999
, когда мне нужно получить 1.0
.
Я могу позволить себе потерять десятичную точку точности, поэтому я использую .toFixed(15)
, какие работы.
Округление работает, но проблема в том, что мне дают 1.000000000000000
.
Есть ли способ округлить до нескольких десятичных знаков, но убрать лишние пробелы?
Примечание: .toPrecision
- это не то, что я хочу; Я хочу указать только количество чисел после десятичной точки.
Примечание 2: Я не могу просто использовать .toPrecision(1)
, потому что мне нужно сохранить высокую точность для чисел, которые на самом деле имеют данные после десятичной точки. В идеале было бы точно столько же десятичных знаков, сколько необходимо (до 15).
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0
Да, есть способ. Используйте parseFloat()
.
parseFloat((1.005).toFixed(15)) //==> 1.005
parseFloat((1.000000000).toFixed(15)) //==> 1
Смотрите живой пример здесь: http://jsfiddle.net/nayish/7JBJw/
Как я понимаю, вы хотите удалить конечные нули в строке, полученной с помощью toFixed()
. Это операция с чистой строкой:
var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, ""); // ==> 1.123
Number(n.toFixed(15)) or +(n.toFixed(15))
преобразует десятизначную строку на 15 место в число, удаляя конечные нули.
Если вы передадите возвращаемое значение в число, эти конечные нули будут удалены. Это также менее подробно, чем parseFloat()
.
+(4.55555).toFixed(2);
//-> 4.56
+(4).toFixed(2);
//-> 4
В этом случае используется unary + operator, поэтому, если вы используете это как часть операции с строкой, вам нужно иметь инфикс + перед ним: var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));
. FYI унарный + перед строкой преобразует его в число. Из MDN: Unary + can:
преобразовать строковые представления целых чисел и float, а также как нестрочные значения true, false и null. Целые числа в обоих десятичные и шестнадцатеричные ( "0x" -предоставляемые) форматы. Отрицательные числа поддерживаются (хотя и не для hex). Если он не может проанализируйте определенное значение, оно будет оцениваться до NaN.
Mmmm, немного другой ответ, для кросс-браузера тоже:
function round(x, n) {
return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}
Ничто из этого не привело меня к тому, что я искал, основываясь на заголовке вопроса, который, например, составлял 5,00, чтобы быть 5 и 5.10, равным 5.1. Мое решение было следующим:
num.toFixed(places).replace(/\.?0+$/, '')
'5.00'.replace(/\.?0+$/, '') // 5
'5.10'.replace(/\.?0+$/, '') // 5.1
'5.0000001'.replace(/\.?0+$/, '') // 5.0000001
'5.0001000'.replace(/\.?0+$/, '') // 5.0001
Примечание. Регулярное выражение работает только в том случае, если places > 0
P.S. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
Существует лучший метод, который сохраняет точность и также разделяет нули. Это принимает номер ввода, и через некоторую магию кастинга вытащить любые завершающие нули. Я нашел, что 16 - предел точности для меня, который довольно хорош, если вы не ставите спутник на плутоне.
function convertToFixed(inputnum)
{
var mynum = inputnum.toPrecision(16);
//If you have a string already ignore this first line and change mynum.toString to the inputnum
var mynumstr = mynum.toString();
return parseFloat(mynumstr);
}
alert(convertToFixed(6.6/6));