我有像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

我错过了什么?


当前回答

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

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

其他回答

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

使用1,而不是2。

js> 2.3 % 1
0.2999999999999998

这个函数将浮点数拆分为整数,并以数组形式返回:

函数拆分数(数) { num = (“”+num).match(/^(-?[0-9]+)([,.][0-9]+)?/)||[]; 返回 [ ~~num[1], +(0+num[2])||0 ]; } console.log(splitNumber(3.02)); [ 3, 0.2 ] console.log(splitNumber(123.456));[ 123, 0.456 ] console.log(splitNumber(789)); [ 789, 0 ] console.log(splitNumber(-2.7)); [ -2, 0.7 ] console.log(splitNumber(“test”)); [ 0, 0 ]

你可以将它扩展为只返回现有的数字,如果不存在数字则返回null:

函数拆分数(数) { num = (“”+num).match(/^(-?[0-9]+)([,.][0-9]+)?/); 返回 [ num ? ~~num[1] : null, num && num[2] ? +(0 + num[2]) : null ]; } console.log(splitNumber(3.02)); [ 3, 0.02 ] console.log(splitNumber(123.456));[ 123, 0.456 ] console.log(splitNumber(789)); [ 789 空 ] console.log(splitNumber(-2.7)); [ -2, 0.7 ] console.log(splitNumber(“test”)); [ 空,空 ]

语言独立方式:

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

注意,它只对分数长度为一个的数字正确)

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