Получить десятичную часть числа с помощью JavaScript

У меня есть числа с плавающей запятой, такие как 3.2 и 1.6.

Мне нужно разделить число на целую и десятичную части. Например, значение 3.2 будет разделено на два числа, т.е. 3 и 0.2

Получение целочисленной части легко:

n = Math.floor(n);

Но у меня возникли проблемы с получением десятичной части. Я пробовал это:

remainer = n % 2; //obtem a parte decimal do rating

Но он работает не всегда правильно.

Предыдущий код имеет следующий вывод:

n = 3.1 => remainer = 1.1

Что мне здесь не хватает?

Ответ 1

Используйте 1, а не 2.

js> 2.3 % 1
0.2999999999999998

Ответ 2

var decimal = n - Math.floor(n)

Хотя это не будет работать для минус-номеров, поэтому нам может понадобиться

n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)

Ответ 3

Вы можете преобразовать в строку, правильно?

n = (n + "").split(".");

Ответ 4

Как 0.2999999999999998 приемлемый ответ? Если бы я был аскером, я бы хотел получить ответ от .3. То, что мы имеем здесь, является ложной точностью, а мои эксперименты с floor,% и т.д. Указывают на то, что Javascript увлекается ложной точностью для этих операций. Поэтому я думаю, что ответы, которые используют преобразование в строку, находятся на правильном пути.

Я бы сделал это:

var decPart = (n+"").split(".")[1];

В частности, я использовал 100233.1, и мне нужен был ответ ".1".

Ответ 5

Простой способ сделать это:

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals); //Returns 0.20000000000000018

Ответ 6

Вот как я это делаю, что, по-моему, самый простой способ сделать это:

var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2

Ответ 7

Следующие действия независимо от региональных настроек для десятичного разделителя... при условии, что для разделителя используется только один символ.

var n = 2015.15;
var integer = Math.floor(n).toString();
var strungNumber = n.toString();
if (integer.length === strungNumber.length)
  return "0";
return strungNumber.substring(integer.length + 1);

Это не очень, но это точно.

Ответ 8

Если точность имеет значение и вам требуются непротиворечивые результаты, вот несколько предложений, которые будут возвращать десятичную часть любого числа в виде строки, включая начальный "0". Если вам это нужно как float, просто добавьте var f = parseFloat( result ) в конце.

Если десятичная часть равна нулю, будет возвращено "0.0". Ноль, NaN и неопределенные числа не проверяются.

1. String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = "0." + ( narray.length > 1 ? narray[1] : "0" );

2. String.substring, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");

3. Math.floor, Number.toFixed, String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = ( nindex > -1 ? (n - Math.floor(n)).toFixed(nstring.length - nindex - 1) : "0.0");

4. Math.floor, Number.toFixed, String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = (narray.length > 1 ? (n - Math.floor(n)).toFixed(narray[1].length) : "0.0");

Вот ссылка на jsPerf: https://jsperf.com/decpart-of-number/

Мы видим, что предложение № 2 является самым быстрым.

Ответ 9

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

var number = 123.123812,
    decimals = +number.toString().replace(/^[^\.]+/,'0');

Ответ 10

В зависимости от использования, которое вы дадите впоследствии, но это простое решение также может помочь вам.

Я не говорю, что это хорошее решение, но для некоторых конкретных случаев работает

var a = 10.2
var c = a.toString().split(".")
console.log(c[1] == 2) //True
console.log(c[1] === 2)  //False

Но это займет больше времени, чем предлагаемое решение @Brian M. Hunt

(2.3 % 1).toFixed(4)

Ответ 11

Не зависит от языка:

var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3

отметим, что он исправляется только для чисел с одной фрактальной длиной)

Ответ 12

Вы можете использовать функцию parseInt(), чтобы получить целую часть, чем использовать ее, чтобы извлечь десятичную часть

var myNumber = 3.2;
var integerPart = parseInt(myNumber);
var decimalPart = myNumber - integerPart;

Или вы можете использовать регулярные выражения, такие как:

splitFloat = function(n){
   const regex = /(\d*)[.,]{1}(\d*)/;
   var m;

   if ((m = regex.exec(n.toString())) !== null) {
       return {
          integer:parseInt(m[1]),
          decimal:parseFloat('0.${m[2]}')
       }
   }
}

Ответ 13

У меня был случай, когда я знал, что все числа, о которых идет речь, будут иметь только одно десятичное число и хотели бы получить десятичную часть как целое число, поэтому я использовал этот подход:

var number = 3.1,
    decimalAsInt = Math.round((number - parseInt(number)) * 10); // returns 1

Это хорошо работает и с целыми числами, возвращая 0 в этих случаях.

Ответ 14

Я использую:

var n = -556.123444444;
var str = n.toString();
var decimalOnly = 0;

if( str.indexOf('.') != -1 ){ //check if has decimal
    var decimalOnly = parseFloat(Math.abs(n).toString().split('.')[1]);
}

Вход: -556.123444444

Результат: 123444444

Ответ 15

Посмотрев на несколько из них, я теперь использую...

var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);

Ответ 16

просто используйте собственный код .toFixed()
Я отвечаю на это здесь fooobar.com/questions/802/...

Ответ 17

n = Math.floor(x);
remainder = x % 1;

Ответ 18

Математические функции работают быстрее, но всегда возвращают ненативные ожидаемые значения. Самый простой способ, который я нашел, это

(3.2+'').replace(/^[-\d]+\./, '')

Ответ 19

Хотя я очень поздно отвечаю на этот вопрос, пожалуйста, посмотрите код.

let floatValue = 3.267848;
let decimalDigits = floatValue.toString().split('.')[1];
let decimalPlaces = decimalDigits.length;
let decimalDivider = Math.pow(10, decimalPlaces);
let fractionValue = decimalDigits/decimalDivider;
let integerValue = floatValue - fractionValue;

console.log("Float value: "+floatValue);
console.log("Integer value: "+integerValue);
console.log("Fraction value: "+fractionValue)

Ответ 20

Используйте это:

function isNatural(n) {
    n = +n
    if (isNaN(n)) return 'NaN';
    return (n >= 0.0) && (Math.floor(n) === n) && n !== Infinity;
  }

Math.frac = function frac(x, m) {
    x = +x
    if (isNatural(x) === 'NaN') return NaN;
    if (isNatural(x) === true) return 0;
    m = +m || 1

      if (isNatural(x) === false && m === 1){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c
        return d;
      }

      if (isNatural(x) === false && m === 2){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = +b
        return c;
      }

      if (isNatural(x) === false && m === 3){
        var a = x.toString()
        var b = a.split('.')[1]
        var c = '0.' + b
        var d = +c * 100
        return d;
      }    
  }

Функция Math.frac здесь имеет 3 режима:

Math.frac(11.635) //0.635
Math.frac(11.635, 1) //0.635 - default mode is 1
Math.frac(11.635, 2) //635
Math.frac(11.635, 3) //63,5 (%)

Это просто :)

Ответ 21

float a=3.2;
int b=(int)a; // you'll get output b=3 here;
int c=(int)a-b; // you'll get c=.2 value here