Ответ 1
Используйте 1
, а не 2
.
js> 2.3 % 1
0.2999999999999998
У меня есть числа с плавающей запятой, такие как 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
, а не 2
.
js> 2.3 % 1
0.2999999999999998
var decimal = n - Math.floor(n)
Хотя это не будет работать для минус-номеров, поэтому нам может понадобиться
n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)
Вы можете преобразовать в строку, правильно?
n = (n + "").split(".");
Как 0.2999999999999998 приемлемый ответ? Если бы я был аскером, я бы хотел получить ответ от .3. То, что мы имеем здесь, является ложной точностью, а мои эксперименты с floor,% и т.д. Указывают на то, что Javascript увлекается ложной точностью для этих операций. Поэтому я думаю, что ответы, которые используют преобразование в строку, находятся на правильном пути.
Я бы сделал это:
var decPart = (n+"").split(".")[1];
В частности, я использовал 100233.1, и мне нужен был ответ ".1".
Простой способ сделать это:
var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals); //Returns 0.20000000000000018
Вот как я это делаю, что, по-моему, самый простой способ сделать это:
var x = 3.2;
int_part = Math.trunc(x); // returns 3
float_part = Number((x-int_part).toFixed(2)); // return 0.2
Следующие действия независимо от региональных настроек для десятичного разделителя... при условии, что для разделителя используется только один символ.
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);
Это не очень, но это точно.
Если точность имеет значение и вам требуются непротиворечивые результаты, вот несколько предложений, которые будут возвращать десятичную часть любого числа в виде строки, включая начальный "0". Если вам это нужно как float, просто добавьте var f = parseFloat( result )
в конце.
Если десятичная часть равна нулю, будет возвращено "0.0". Ноль, NaN и неопределенные числа не проверяются.
var nstring = (n + ""),
narray = nstring.split("."),
result = "0." + ( narray.length > 1 ? narray[1] : "0" );
var nstring = (n + ""),
nindex = nstring.indexOf("."),
result = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");
var nstring = (n + ""),
nindex = nstring.indexOf("."),
result = ( nindex > -1 ? (n - Math.floor(n)).toFixed(nstring.length - nindex - 1) : "0.0");
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 является самым быстрым.
Вы можете преобразовать его в строку и использовать метод replace
для замены целочисленной части на ноль, а затем преобразовать результат обратно в число:
var number = 123.123812,
decimals = +number.toString().replace(/^[^\.]+/,'0');
В зависимости от использования, которое вы дадите впоследствии, но это простое решение также может помочь вам.
Я не говорю, что это хорошее решение, но для некоторых конкретных случаев работает
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)
Не зависит от языка:
var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3
отметим, что он исправляется только для чисел с одной фрактальной длиной)
Вы можете использовать функцию 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]}')
}
}
}
У меня был случай, когда я знал, что все числа, о которых идет речь, будут иметь только одно десятичное число и хотели бы получить десятичную часть как целое число, поэтому я использовал этот подход:
var number = 3.1,
decimalAsInt = Math.round((number - parseInt(number)) * 10); // returns 1
Это хорошо работает и с целыми числами, возвращая 0 в этих случаях.
Я использую:
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
Посмотрев на несколько из них, я теперь использую...
var rtnValue = Number(7.23);
var tempDec = ((rtnValue / 1) - Math.floor(rtnValue)).toFixed(2);
просто используйте собственный код .toFixed()
Я отвечаю на это здесь fooobar.com/questions/802/...
n = Math.floor(x);
remainder = x % 1;
Математические функции работают быстрее, но всегда возвращают ненативные ожидаемые значения. Самый простой способ, который я нашел, это
(3.2+'').replace(/^[-\d]+\./, '')
Хотя я очень поздно отвечаю на этот вопрос, пожалуйста, посмотрите код.
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)
Используйте это:
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 (%)
Это просто :)
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