用JavaScript获取数字的小数部分

我有浮动数字像3.21.6

我需要将数字分成整数和小数部分。 例如, 3.2的值将被分成两个数字,即30.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) 

你可以转换为string,对不对?

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

0.2999999999999998怎么样是一个可以接受的答案? 如果我是提问者,我想要一个.3的答案。 我们这里有什么是错误的精确度,而且我对floor,%等的实验表明Javascript喜欢这些操作的错误精度。 所以我认为使用转换为string的答案是正确的。

我会这样做:

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

具体来说,我正在使用100233.1,我想要答案“.1”。

一个简单的方法是:

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

你可以将它转换为一个string,并使用replace方法将整数部分replace为零,然后将结果转换回一个数字:

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

根据您以后的使用情况,但这个简单的解决scheme也可以帮助你。

我不是说它是一个很好的解决scheme,但对于一些具体案例的作品

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

但是这将需要比@Brian M. Hunt提出的解决scheme更长的时间

 (2.3 % 1).toFixed(4) 

下面的工作,无论小数点分隔符的区域设置…在条件只有一个字符用于分隔符。

 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); 

这不是很漂亮,但它是准确的。

以下是我如何做到这一点,我认为这是最简单的方法:

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

语言独立的方式:

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

请注意,它仅适用于具有一个分数长度的数字)

如果精度很重要,并且需要一致的结果,这里有一些命题将返回任意数字的小数部分作为string,包括前导“0”。

如果小数部分等于零,则返回“0.0”。 Null,NaN和未定义的数字未经testing。

1. Array.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是最快的。

我有一个情况,我知道所有数字有问题只有一个小数,并希望得到小数部分作为一个整数,所以我最终使用这种方法:

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

这与整数也很好,在这种情况下返回0。

看了几个这些,我现在使用…

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

只需使用本地代码.toFixed()
我在这里回答https://stackoverflow.com/a/47059095/1919821

我在用:

 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]); } 

input:-556.123444444

结果: 123444444

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