floating-point floating point - Как отформатировать float в javascript?



6 Answers

Существуют функции для округления чисел. Например:

var x = 5.0364342423;
print(x.toFixed(2));

напечатает 5.04.

Редактировать: Fiddle

division js decimal

В JavaScript при преобразовании из float в строку, как я могу получить всего 2 цифры после десятичной точки? Например, 0,34 вместо 0,3445434.




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

var x=(23-7.37)
x
15.629999999999999
x.toFixed(6)
"15.630000"

Идея состоит в том, чтобы очистить выход с помощью RegExp :

function humanize(x){
  return x.toFixed(6).replace(/\.?0*$/,'');
}

RegExp соответствует конечным нулям (и, необязательно, десятичной точке), чтобы убедиться, что он отлично подходит для целых чисел.

humanize(23-7.37)
"15.63"
humanize(1200)
"1200"
humanize(1200.03)
"1200.03"
humanize(3/4)
"0.75"
humanize(4/3)
"1.333333"



Существует проблема со всеми этими решениями, использующими множители. Кя, кыки и решения Кристофа, к сожалению.

Пожалуйста, проверьте свой код на номер 551.175 с 2 десятичными знаками - он будет округлен до 551,17, тогда как он должен быть 551,18 ! Но если вы проверите напр. 451.175 это будет нормально - 451.18. Поэтому на первый взгляд трудно заметить эту ошибку.

Проблема заключается в умножении: try 551.175 * 100 = 55117.49999999999 (ups!)

Поэтому моя идея - обработать его с помощью toFixed () перед использованием Math.round ();

function roundFix(number, precision)
{
    var multi = Math.pow(10, precision);
    return Math.round( (number * multi).toFixed(precision + 1) ) / multi;
}



function trimNumber(num, len) {
  const modulu_one = 1;
  const start_numbers_float=2;
  var int_part = Math.trunc(num);
  var float_part = String(num % modulu_one);
      float_part = float_part.slice(start_numbers_float, start_numbers_float+len);
  return int_part+'.'+float_part;
}



Невозможно избежать несогласованного округления цен с x.xx5 как фактическое значение с использованием либо умножения, либо деления. Если вам нужно рассчитать правильные цены на стороне клиента, вы должны хранить все суммы в центах. Это связано с характером внутреннего представления числовых значений в JavaScript. Обратите внимание, что Excel страдает от одних и тех же проблем, поэтому большинство людей не замечают небольших ошибок, вызванных этим феноменом. Однако ошибки могут накапливаться всякий раз, когда вы добавляете много вычисленных значений, существует целая теория вокруг этого, включающая порядок вычислений и другие методы, чтобы минимизировать ошибку в конечном результате. Чтобы подчеркнуть проблемы с десятичными значениями, обратите внимание, что 0,1 + 0,2 не точно равно 0,3 в JavaScript, а 1 + 2 равно 3.




Я использую этот код для форматирования поплавков. Он основан на toPrecision() но он удаляет ненужные нули. Я бы приветствовал предложения о том, как упростить регулярное выражение.

function round(x, n) {
    var exp = Math.pow(10, n);
    return Math.floor(x*exp + 0.5)/exp;
}

Пример использования:

function test(x, n, d) {
    var rounded = rnd(x, d);
    var result = rounded.toPrecision(n);
    result = result.replace(/\.?0*$/, '');
    result = result.replace(/\.?0*e/, 'e');
    result = result.replace('e+', 'e');
    return result;  
}

document.write(test(1.2000e45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2000e+45, 3, 2) + '=' + '1.2e45' + '<br>');
document.write(test(1.2340e45, 3, 2) + '=' + '1.23e45' + '<br>');
document.write(test(1.2350e45, 3, 2) + '=' + '1.24e45' + '<br>');
document.write(test(1.0000, 3, 2) + '=' + '1' + '<br>');
document.write(test(1.0100, 3, 2) + '=' + '1.01' + '<br>');
document.write(test(1.2340, 4, 2) + '=' + '1.23' + '<br>');
document.write(test(1.2350, 4, 2) + '=' + '1.24' + '<br>');



Related