JavaScript: округлить до десятичных знаков, но лишние нули - PullRequest
73 голосов
/ 06 сентября 2011

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

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

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

Ответы [ 8 ]

131 голосов
/ 06 сентября 2011
>>> parseFloat(0.9999999.toFixed(4));
1
>>> parseFloat(0.0009999999.toFixed(4));
0.001
>>> parseFloat(0.0000009999999.toFixed(4));
0
32 голосов
/ 06 сентября 2011

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

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

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

18 голосов
/ 06 сентября 2011

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

var x = 1.1230000;
var y = x.toFixed(15).replace(/0+$/, "");  // ==> 1.123
9 голосов
/ 06 сентября 2011

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

6 голосов
/ 01 декабря 2014

Если вы приведете возвращаемое значение к числу, эти конечные нули будут сброшены.Это также менее многословно, чем parseFloat().

+(4.55555).toFixed(2);
//-> 4.56

+(4).toFixed(2);
//-> 4

При этом используется унарный + оператор , поэтому, если вы используете его как часть строковой операции, вам нужен инфикс +до этого: var n=0.9999999999999999; console.log('output ' + +n.toFixed(2));.К вашему сведению унарный + перед строкой преобразует его в число.Из MDN: Unary + может:

преобразовывать строковые представления целых чисел и чисел с плавающей точкой, а также нестроковые значения true, false и null.Поддерживаются целые числа в десятичном и шестнадцатеричном (с префиксом «0x») формате.Отрицательные числа поддерживаются (но не для шестнадцатеричных).Если он не может проанализировать определенное значение, он оценивается как NaN.

4 голосов
/ 12 февраля 2014

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

function round(x, n) {
    return Math.round(x * Math.pow(10, n)) / Math.pow(10, n)
}
1 голос
/ 23 декабря 2014

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

PS https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed

0 голосов
/ 30 сентября 2015

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