我有像3.2和1.6这样的浮点数。

我需要把这个数分成整数部分和小数部分。例如,3.2的值将被分成两个数字,即3和0.2

获取整数部分很简单:

n = Math.floor(n);

但是我在计算小数部分时遇到了麻烦。 我试过了:

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

但它并不总是正确工作。

前面的代码有以下输出:

n = 3.1 // gives remainder = 1.1

我错过了什么?


当前回答

我有一个案例,我知道所有的数字都只有一个小数,想要得到小数部分作为整数,所以我最终使用这种方法:

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

这也适用于整数,在这些情况下返回0。

其他回答

避免数学不精确的最好方法是转换为字符串,但要确保它是你期望的“点”格式,使用toLocaleString:

函数getDecimals(n) { //注意,maximumSignificantDigits默认为3,所以如果不更改,您的小数将被四舍五入。 const parts = n.toLocaleString('en-US', {maximumSignificantDigits: 18}).split('.') 返回的部分。长度> 1 ?数量(' 0。' +部分[1]):0 } console.log (getDecimals (10.58))

var decimal = n - Math.floor(n)

虽然这对负数不成立所以我们可能要这么做

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

如果精度很重要,并且您需要一致的结果,这里有一些命题,它们将以字符串形式返回任何数字的小数部分,包括前导的“0.”。如果你需要它作为一个浮点数,只需在最后添加var f = parseFloat(result)。

如果小数部分等于零,则返回"0.0"。不测试Null, 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是最快的。

您可以使用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]}`)
       }
   }
}

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

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