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

Osc*_*car 224 javascript floating-point numbers decimal rounding

我有像3.2和的浮点数1.6.

我需要将数字分成整数和小数部分.例如,值3.2将被分成两个数字,即30.2

获取整数部分很简单:

n = Math.floor(n);
Run Code Online (Sandbox Code Playgroud)

但是我无法获得小数部分.我试过这个:

remainer = n % 2; //obtem a parte decimal do rating
Run Code Online (Sandbox Code Playgroud)

但它并不总是正常工作.

前面的代码具有以下输出:

n = 3.1 => remainer = 1.1
Run Code Online (Sandbox Code Playgroud)

我在这里缺少什么?

Ign*_*ams 333

使用1,而不是2.

js> 2.3 % 1
0.2999999999999998
Run Code Online (Sandbox Code Playgroud)

  • 为避免出现浮点舍入问题,在某些情况下使用`toFixed`可能会有所帮助,例如``(2.3%1).toFixed(4)`==`"0.3000"`. (55认同)
  • 在0.2999999999999998等于0.3的世界中,这可能是可接受的.对我来说不是......因此,为了解决这个挑战,我不会使用`Math.*`或`%`操作. (46认同)
  • 在一个数字为"2.3"的世界中,而不是"2"或"3",数字"0.2999999999999998"是完全可以接受的,尽管人类的眼睛看起来很侮辱. (12认同)
  • `(2.3%1).toFixed(4).substring(2)`=`"3000"`如果你需要它而没有`0.` (9认同)
  • @GershomMaes,在很多情况下这个数字是不可接受的。 (5认同)
  • 你们需要阅读浮点算术。就像没有无限数量的数字就无法表示十进制的 1/3 一样,没有无限数量的数字也无法表示二进制的 0.3。如果您出于显示目的以外的任何原因无法接受这一点,那么什么都不会。Js 已经使用 64 位 fp 进行算术,如果您打算保留硬件支持,这就是您所能得到的最好结果。除非您打算编写一个库来以不同的基数进行数学运算,否则您唯一会得到的是最后 8 之前的更多 9,例如 128 位浮点/定点。 (3认同)
  • @MarcelStör,我很抱歉,但在数学中 .3 等于 IS 等于 .29999999 (永远持续下去)让我们使用一个更简单的例子,这样你就明白了 .99999... = 1 1.(x = .999999...) 。2.(10x = 9.999999) 3.(10x - x = 10 - .999... = 9) 4. (9x = 9) x = 9/9 x = 1 AND x = .999... 我们可以接受这个想法并将其扩展到任何小数位并永远重复 9(除非您与该规则相矛盾) (2认同)
  • 当你处理货币金额时,2.9999...是不可接受的,计算机和数学也不同:计算机对小数有限制,所以必须在某个地方截断,数学没有这个限制,所以在编程时你没有在理论数学领域,你处于计算机有限制的领域。 (2认同)

gre*_*ala 84

var decimal = n - Math.floor(n)
Run Code Online (Sandbox Code Playgroud)

虽然这不适用于减号,但我们可能不得不这样做

n = Math.abs(n); // Change to positive
var decimal = n - Math.floor(n)
Run Code Online (Sandbox Code Playgroud)

  • `var n = 3.2,integr = Math.floor(n),decimal = n - integr;`使用_Math.floor()_只需一次.`integr = 3; decimal = 0.20000000000000018;` (4认同)
  • 为了处理负数,只需将“Math.floor”与“Math.trunc”交换即可。 (3认同)

sdl*_*rhc 71

你可以转换为字符串,对吗?

n = (n + "").split(".");
Run Code Online (Sandbox Code Playgroud)

  • 除了欧洲大陆之外,这里的工作正常,逗号是小数点分隔符.如果您打算使用此功能,请记住,如果您是跨国公司并且目标欧洲,请考虑到这一点,因为此解决方案对他们来说不会很好. (14认同)
  • 我是来自欧洲大陆的法国火狐,它有效.通常我们会在法国使用逗号作为小数分隔符.原因是在JavaScript中将Number转换为字符串时没有涉及文化,尽管我更喜欢使用`n.toString()`而不是`n +""`因为它更具可读性. (6认同)
  • 如果速度很重要,那么`n + ""` 确实更好(参见 https://jsperf.com/number-vs-number-tostring-vs-string-number) (3认同)
  • @cdmdotnet JS 使用 `.` 作为小数分隔符,因此如果您的输入变量的类型是 float,那么您在任何地方都可以。如果您的输入是字符串,则只需处理该问题。我还必须注意,这个答案返回数组中的字符串。更完整的解决方案是 parseFloat('0.' + (n + '').split('.')[1])` (3认同)

jom*_*odo 29

0.2999999999999998怎么回答?如果我是提问者,我会想要答案.3.我们在这里得到的是错误的精确度,我对floor,%等的实验表明Javascript喜欢这些操作的错误精度.所以我认为使用转换为字符串的答案是正确的.

我会这样做:

var decPart = (n+"").split(".")[1];
Run Code Online (Sandbox Code Playgroud)

具体来说,我使用100233.1,我想要答案".1".

  • 我普遍同意,但你不能依赖'.' 正则表达式为[小数点分隔符是一个i18n字符](http://en.wikipedia.org/wiki/Decimal_separator). (6认同)
  • @jomofrodo实际上,有些人可能想要非舍入值。我不记得OP要求四舍五入的值,只是分割值。 (2认同)
  • `.toString()` 不考虑 i18n。小数点分隔符将始终为“.” [根据 MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString) 和 [ECMA 规范](https ://www.ecma-international.org/ecma-262/5.1/#sec-9.8.1) (2认同)

Zan*_*fio 14

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

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


Eth*_*han 13

一个简单的方法是:

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals); //Returns 0.20000000000000018
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有返回确切的值.但是,这很容易修复:

var x = 3.2;
var decimals = x - Math.floor(x);
console.log(decimals.toFixed(1)); //Returns 0.2
Run Code Online (Sandbox Code Playgroud)

如果你不知道小数位数,你可以使用它:

var x = 3.2;
var decimals = x - Math.floor(x);

var decimalPlaces = x.toString().split('.')[1].length;
decimals = decimals.toFixed(decimalPlaces);

console.log(decimals); //Returns 0.2
Run Code Online (Sandbox Code Playgroud)


Nur*_*lan 10

语言独立方式:

var a = 3.2;
var fract = a * 10 % 10 /10; //0.2
var integr = a - fract; //3
Run Code Online (Sandbox Code Playgroud)

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

  • @hotzst,没有特定于语言的功能 (4认同)
  • 你能解释一下为什么你认为这是独立于语言的吗?它是 JavaScript。 (3认同)
  • 独立于语言,因为它只是纯数学。实用的解决方案。具有所需的分数长度: `var factor = Math.pow(10,desiredFractionLength); var fract = a * 因子 % 因子 / 因子;` (3认同)

She*_*eki 7

您可以使用parseInt()函数来获取整数部分而不是使用它来提取小数部分

var myNumber = 3.2;
var integerPart = parseInt(myNumber);
var decimalPart = myNumber - integerPart;
Run Code Online (Sandbox Code Playgroud)

或者你可以使用正则表达式,如:

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]}`)
       }
   }
}
Run Code Online (Sandbox Code Playgroud)


mas*_*ilo 6

只需使用模 1 即可。

remainder = x % 1;
Run Code Online (Sandbox Code Playgroud)


Eri*_*dán 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
Run Code Online (Sandbox Code Playgroud)

在一行代码中

let [firstNumber, secondNumber] = [+number.toString().split('.')[0], +number.toString().split('.')[1]];
Run Code Online (Sandbox Code Playgroud)


cdm*_*net 5

无论小数分隔符的区域设置如何,以下情况都有效...条件只有一个字符用于分隔符.

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);
Run Code Online (Sandbox Code Playgroud)

它不漂亮,但它是准确的.


Gab*_*ocq 5

如果精度很重要,并且您需要一致的结果,则以下是一些命题,它将以字符串形式返回任何数字的小数部分,包括前导“ 0”。如果您需要它作为浮点数,则只需var f = parseFloat( result )在末尾添加即可。

如果小数部分等于零,则将返回“ 0.0”。空,NaN和未定义的数字未测试。

1. String.split

var nstring = (n + ""),
    narray  = nstring.split("."),
    result  = "0." + ( narray.length > 1 ? narray[1] : "0" );
Run Code Online (Sandbox Code Playgroud)

2. String.substring,String.indexOf

var nstring = (n + ""),
    nindex  = nstring.indexOf("."),
    result  = "0." + (nindex > -1 ? nstring.substring(nindex + 1) : "0");
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

这是jsPerf链接:https ://jsperf.com/decpart-of-number/

我们可以看到,命题2是最快的。