用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
,而不是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