使用JavaScript获取数字的小数部分

361

我有像 3.21.6 这样的浮点数。

我需要将这个数字分离成整数和小数两部分。例如,值为 3.2 的数字将被拆分为两个数字,即 30.2

获取整数部分很容易:

n = Math.floor(n);

但是我在获取小数部分时遇到了问题。 我尝试过这个:

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

但它并不总是正确的工作。

先前的代码产生以下输出:

n = 3.1 // gives remainder = 1.1

我这里缺少了什么?


2
请注意,n = Math.floor(n); 仅适用于非负数,以返回您所需的结果(整数部分)。 - tsemer
请使用“%1”而不是“%2”来简化操作。 - masterxilo
4
decimalPart = number - Math.floor(number) 可以翻译为:小数部分等于数字减去向下取整后的结果。此外,你可以增加精度。parseFloat(decimalPart.toPrecision(3))表示保留 3 位小数的浮点数。 - Abhishek Chandel
要获取浮点数的整数部分,请使用Math.trunc(),而不是Math.floor()。 - undefined
33个回答

6
一个不错的选择是将数字转换为字符串,然后再进行拆分。
// Decimal number
let number = 3.2;

// Convert it into a string
let string = number.toString();

// Split the dot
let array = string.split('.');

// Get both numbers
// The '+' sign transforms the string into a number again
let firstNumber  = +array[0]; // 3
let secondNumber = +array[1]; // 2

一行代码实现
let [firstNumber, secondNumber] = [+number.toString().split('.')[0], +number.toString().split('.')[1]];

5

只需使用模数1。

remainder = x % 1;

不适用于“3.02”,第一个小数位为零!我发布了一个高效的函数答案,你能测试一下吗? - Cesar Devesa

4

根据您之后的使用情况,这个简单的解决方案可能也能帮到您。

我并不是说这是一个好的解决方案,但对于一些具体情况来说是有效的。

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)

1
这个在欧洲大陆以外的地方都能正常工作,但是在欧洲大陆使用逗号 , 作为小数点分隔符。 如果你计划使用它,并且你的目标是欧洲多国市场,请记得考虑到这一点,因为这个解决方案对他们来说效果不佳。 - cdmdotnet

4

You can simply use parseInt() function to help, example:

let decimal = 3.2;
let remainder = decimal - parseInt(decimal);
document.write(remainder);


真他妈简单!!! - Hayden Thring

3

我正在使用:

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


2

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

function getDecimals(n) {
  // Note that maximumSignificantDigits defaults to 3 so your decimals will be rounded if not changed.
  const parts = n.toLocaleString('en-US', { maximumSignificantDigits: 18 }).split('.')
  return parts.length > 1 ? Number('0.' + parts[1]) : 0
}

console.log(getDecimals(10.58))


2

解决方案

最简单的方法是使用模(%)运算符:

var decimal = n % 1;

说明

取模运算符给出算术除法的余数。

例子: 14 % 4 是 2,因为 14 / 4 是 3,其余数是 2。

那么,由于 n % 1 总是介于 0 和 1 或 [0, 1) 之间,它对应于 n 的小数部分。


2
你可以将其转换为字符串并使用 replace 方法将整数部分替换为零,然后将结果转换回数字:
var number = 123.123812,
    decimals = +number.toString().replace(/^[^\.]+/,'0');

这种解决方案在欧洲大陆使用逗号作为小数点分隔符不可行吗? - preston
@preston 你可以用任何其他分隔符替换正则表达式中的句点(比如 /^[^,]/),但是你应该将结果作为字符串保留(移除 + 运算符),以避免出现 NaN 的结果。 - gion_13
这不是这样运作的,要使代码通用,否则它注定会失败。 - vanowm
我想你的意思是注定要失败。 - code_monk

2

数学函数更快,但总是返回非本地预期值。我发现最简单的方法是

Original Answer翻译成:"最初的回答"

(3.2+'').replace(/^[-\d]+\./, '')

1

我曾经遇到这样一个情况,我知道所有的数字都只有一位小数,想要将小数部分转换为整数,最终我采用了以下方法:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接