JavaScript: округление до нескольких десятичных знаков, но полосы лишние нули

Здесь сценарий: я получаю .9999999999999999, когда мне нужно получить 1.0.
Я могу позволить себе потерять десятичную точку точности, поэтому я использую .toFixed(15), какие работы.

Округление работает, но проблема в том, что мне дают 1.000000000000000.
Есть ли способ округлить до нескольких десятичных знаков, но убрать лишние пробелы?

Примечание: .toPrecision - это не то, что я хочу; Я хочу указать только количество чисел после десятичной точки.
Примечание 2: Я не могу просто использовать .toPrecision(1), потому что мне нужно сохранить высокую точность для чисел, которые на самом деле имеют данные после десятичной точки. В идеале было бы точно столько же десятичных знаков, сколько необходимо (до 15).

Ответ 1

>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0

Ответ 2

Да, есть способ. Используйте parseFloat().

parseFloat((1.005).toFixed(15)) //==> 1.005
parseFloat((1.000000000).toFixed(15)) //==> 1

Смотрите живой пример здесь: http://jsfiddle.net/nayish/7JBJw/

Ответ 3

Как я понимаю, вы хотите удалить конечные нули в строке, полученной с помощью toFixed(). Это операция с чистой строкой:

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123

Ответ 4

Number(n.toFixed(15)) or +(n.toFixed(15)) преобразует десятизначную строку на 15 место в число, удаляя конечные нули.

Ответ 5

Если вы передадите возвращаемое значение в число, эти конечные нули будут удалены. Это также менее подробно, чем 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.

Ответ 6

Mmmm, немного другой ответ, для кросс-браузера тоже:

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}

Ответ 7

Ничто из этого не привело меня к тому, что я искал, основываясь на заголовке вопроса, который, например, составлял 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

Ответ 8

Существует лучший метод, который сохраняет точность и также разделяет нули. Это принимает номер ввода, и через некоторую магию кастинга вытащить любые завершающие нули. Я нашел, что 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));