如何从JavaScript编号中删除小数部分?

Jac*_*Dev 194 javascript

我有一个除法的结果,我希望丢弃结果数的小数部分.

我怎样才能做到这一点?

ale*_*lex 342

你可以用......

...取决于您想要删除小数的方式.

Math.trunc()尚未在所有平台上支持(即IE),但在此期间您可以轻松使用polyfill.

通过使用按位运算符(.eg |0)来截断具有出色平台支持的小数部分的另一种方法.在数字上使用按位运算符的副作用是它将其操作数视为带符号的32位整数,因此删除小数部分.请记住,这也会破坏大于32位的数字.


您可能还在谈论使用浮点运算进行十进制舍入的不准确性.

必读 - 每个计算机科学家应该知道的关于浮点运算的内容.

  • 请记住,当数字为**负**时,`Math.floor()`将**增加**数值.因此`Math.floor(-1.2) - > -2`而`Math.floor(1.2) - > 1`.`parseInt(-1.2) - > -1`(由@FloydPink_提及_)将丢弃_positive_和_negative_数字所需的小数部分. (26认同)
  • @Jake javascript中`2.3*100`的结果是'229.99999999999997`,因此看起来bitwise运算符在你的例子中正确地完成了它的工作. (4认同)
  • 以下显示这个答案是不稳定的:```>(2.305*100)| 0> 230>(2.3*100)| 0> 229``` (2认同)

Bra*_*iak 37

您还可以使用按位运算符截断小数.

例如

var x = 9 / 2;
console.log(x); // 4.5

x = ~~x;
console.log(x); // 4

x = -3.7
console.log(~~x) // -3
console.log(x | 0) // -3
console.log(x << 0) // -3
Run Code Online (Sandbox Code Playgroud)

按位运算比数学函数更有效.双不是位运算符也似乎略微跑赢大盘x | 0,并x << 0通过一个微不足道的位操作.

// 952 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) | 0;
}

// 1150 milliseconds
for (var i = 0; i < 1000000; i++) {
    (i * 0.5) << 0;
}

// 1284 milliseconds
for (var i = 0; i < 1000000; i++) {
    Math.trunc(i * 0.5);
}

// 939 milliseconds
for (var i = 0; i < 1000000; i++) {
    ~~(i * 0.5);
}
Run Code Online (Sandbox Code Playgroud)

另外值得注意的是,按位非运算符优先于算术运算,因此您可能需要用括号括起计算以获得预期结果:

x = -3.7

console.log(~~x * 2) // -6
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7

console.log(~~(x * 2)) // -7
console.log(x * 2 | 0) // -7
console.log(x * 2 << 0) // -7
Run Code Online (Sandbox Code Playgroud)

有关double bitwise not运算符的更多信息可以在Double bitwise NOT(~~)找到

  • 可能效率不高。但是,我建议使用“数学”函数,因为它更具可读性。 (3认同)

Har*_*til 28

你也可以这样做

parseInt(a/b)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`parseInt`对于大数字不会可靠地工作,因为它首先将其参数转换为字符串,而对于大数字,结果将使用指数表示法.例如:`var n = 22222222222222222222222; parseInt(n);`将返回`2`,因为`n.toString()`返回`2.2222222222222223e + 22`. (16认同)
  • 它也没有使用parseInt()来达到目的,即在字符串中获取一个数字并返回一个Number。 (2认同)

小智 23

例如:

var x = 9.656;
x.toFixed(0);           // returns 10
x.toFixed(2);           // returns 9.66
x.toFixed(4);           // returns 9.6560
x.toFixed(6);           // returns 9.656000 
Run Code Online (Sandbox Code Playgroud)

或者

parseInt("10");         // returns 10
parseInt("10.33");      // returns 10
parseInt("10 20 30");   // returns 10
parseInt("10 years");   // returns 10
parseInt("years 10");   // returns NaN  
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么这个答案没有任何荣誉,它对我有用,并且已集成到 React / JavaScript 标准中 (3认同)

Mah*_*ian 17

你也可以使用以下代码在小数点后面显示一定数量的数字(这里是2位数):

var num = (15.46974).toFixed(2)
console.log(num) // 15.47
console.log(typeof num) // string
Run Code Online (Sandbox Code Playgroud)

  • 请注意,toFixed()返回一个String,而不是Number.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed (4认同)
  • 作为OP要求删除小数部分的答案如何 (3认同)
  • 尽管它返回一个字符串,但是您可以使用Number()方法来更正它。.Number((15.46974).toFixed(2)) (3认同)

Dav*_*ton 12

使用Math.round().

(亚历克斯的答案更好;我做了一个假设:)


小智 8

使用Math.round()功能.

Math.round(65.98) // will return 66 
Math.round(65.28) // will return 65
Run Code Online (Sandbox Code Playgroud)

  • 为了完整性,这是纯JavaScript,而不是查询. (17认同)

sre*_*rna 7

以下是在之前帖子的帮助下的详细压缩解释:

1. Math.trunc() :用于删除点后面的数字。它隐式转换。但是,IE 不支持。

例子:

Math.trunc(10.5) // 10
Math.trunc(-10.5) // -10    
Run Code Online (Sandbox Code Playgroud)

其他替代方法:使用按位非运算符:

例子:

x= 5.5
~~x // 5
Run Code Online (Sandbox Code Playgroud)

2. Math.floor() :用于给出可能的最小整数值。所有浏览器都支持它。

例子:

Math.floor(10.5) // 10
Math.floor(-10.5) // -11
Run Code Online (Sandbox Code Playgroud)

3. Math.ceil() :用于给出可能的最大整数值。所有浏览器都支持它。

例子:

Math.ceil(10.5) // 11
Math.ceil(-10.5) // -10
Run Code Online (Sandbox Code Playgroud)

4. Math.round() :四舍五入到最接近的整数。所有浏览器都支持它。

例子:

Math.round(10.5) // 11
Math.round(-10.5)// -10
Math.round(10.49) // 10
Math.round(-10.51) // -11
Run Code Online (Sandbox Code Playgroud)


Cha*_*Nau 6

使用ES2015,可以使用Math.trunc().

Math.trunc(2.3)                       // 2
Math.trunc(-2.3)                      // -2
Math.trunc(22222222222222222222222.3) // 2.2222222222222223e+22
Math.trunc("2.3")                     // 2
Math.trunc("two")                     // NaN
Math.trunc(NaN)                       // NaN
Run Code Online (Sandbox Code Playgroud)

它在IE11或更低版本中不受支持,但在Edge和其他所有现代浏览器中都可以使用.

  • 知道允许截断到X个小数位的任何变化吗?天真的认为`Math.trunc(value * Math.pow(10,x))/ Math.pow(10,x)`会起作用吗? (2认同)
  • 嗨,杰米(Jamie),在大多数情况下都可以使用,但是很容易受到浮点陷阱的影响。例如,“值= 2.3”和“ x = 2”将返回“ 2.29”。我没有更好的建议。 (2认同)