Как ограничить округление числа с плавающей запятой только его «десятичной частью», не затрагивая «целую часть» - PullRequest
1 голос
/ 09 июля 2020
• 1000 целые части обрабатываются и подвергаются влиянию в процессе округления ).

Итак, обычно (округление дробей в большую сторону):

   12.9768 Rounded to 3 decimal places is 12.977
           Rounded to 2 decimal places is 12.98
           Rounded to 1 decimal place  is 13.0     <== Whole part also changed
           Rounded to 0 decimal place  is 13       <== Whole part also changed

В приведенных выше примерах вся часть также изменяется, когда дробная часть достигает целого числа. Я ищу округление (с использованием javascript) из только дробной части числа (до количества указанных мест), но без влияния на целую часть числа , так (приведенные выше примеры станут):

   12.9768 Rounded to 3 decimal places is 12.977
           Rounded to 2 decimal places is 12.98
           Rounded to 1 decimal place  is 12.9
           Rounded to 0 decimal place  is 12
           Rounded to 7 decimal places is 12.9768000

В приведенном выше дробная часть будет округлена до любых требуемых десятичных знаков , но вся часть n umber не будет затронут .

Требуются конечные нули, поэтому формат вывода будет строковым.

Этот процесс ограничивает округление дробной частью числа с плавающей запятой с помощью предельный предел / предел в том смысле, что округление не распространяется на всю часть; т. е. максимальная доля всегда будет 0,999 и т. д. c.

Ситуация, в которой это используется, заключается в том, что в магазине ценники должны отображаться как NN. часть вычислений он не может создать целое число. Таким образом, если первоначальная цена покупки составляет 22,45 доллара США, и округление из-за каких-либо расчетов не должно приводить к тому, что 22 доллара США станут 23. Таким образом, это может быть любое значение до 22,99. Это пример, в котором дробь равна 2 десятичным знакам (т. Е. В центах США), но если дробь не равна 2, требуется универсальное c и гибкое решение для округления только дробной части, не касаясь всей части.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 10 июля 2020

Эта блок-схема может быть односторонним для решения:

введите описание изображения здесь

0 голосов
/ 09 июля 2020

Попробуйте следующую функцию ... Она в основном обрезает все, что находится после указанного десятичного разряда.

function precission(n, count) {
  var indicator = Math.pow(10, count) || 1;

  return ((n * indicator) | 0) / indicator;
}

Если вам нужны конечные нули, просто используйте string.padEnd (count, "0")

Обновление:

var num = 12.9768;

function precission(n, count) {
  var indicator = Math.pow(10, count) || 1;
  var whole = n | 0;
  var decimal = n - whole;
  var rounded = Math.round(decimal * indicator) / indicator;

  return rounded >= 1 ? whole : whole + rounded;
}

console.log(precission(num, 0));
console.log(precission(num, 1)); //prints 12 because otherwise it would have been 13
console.log(precission(num, 2));
console.log(precission(num, 3));
console.log(precission(num, 6));

Это то, что вы ищете?

0 голосов
/ 09 июля 2020

Имея небольшой javascript опыт, попробую использовать псевдокод / ​​javascript решение:

function MA_Round(n, precision) {
  // break into whole and fractional parts
  var whole =  Math.trunc(n);
  var frac =  n - whole;

  // Round fraction
  var pow10 = Math.pow(10, precision);
  var rvalue = Math.round(frac*pow10)/pow10;

  // Form limit of highest fractional value and apply
  var limit = 1.0 - 1.0/pow10;
  if (Math.abs(rvalue) > limit) rvalue = limit;

  // Form result
  return whole + rvalue;
}
0 голосов
/ 09 июля 2020

Чтобы получить полное число в том виде, в каком оно есть, используйте

 Math.floor(12.9768)

Он даст вам целое число, которое ожидается от вас, для получения дробной части как есть, или вы можете сделать как

Math.floor(12.9768) + ( 12.9768 - Math.floor(12.9768) )
...