博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在JavaScript中将浮点数转换为整数?
阅读量:3577 次
发布时间:2019-05-20

本文共 5304 字,大约阅读时间需要 17 分钟。

我想在中将浮点数转换为整数。 实际上,我想知道如何同时进行标准转换:截断和舍入。 而且有效,而不是通过转换为字符串和解析。


#1楼

按位或运算符

可以使用按位或运算符截断浮点数,它既可以用于正数也可以用于负数:

function float2int (value) {    return value | 0;}

结果

float2int(3.1) == 3float2int(-3.1) == -3float2int(3.9) == 3float2int(-3.9) == -3

性能比较?

我创建了一个 ,用于比较以下两者之间的性能:

  • Math.floor(val)
  • val | 0 val | 0 按位
  • ~~val 按位
  • parseInt(val)

仅适用于正数。 在这种情况下,可以安全地使用按位运算以及Math.floor函数。

但是,如果您需要代码同时使用正数和负数 ,那么按位运算是最快的(或首选)。 进行了比较,很明显,由于附加的符号检查, Math现在是这四个中最慢的。

注意

如评论中所述,BITWISE运算符对带符号的32位整数进行运算,因此将转换大数,例如:

1234567890  | 0 => 123456789012345678901 | 0 => -539222987

#2楼

注意:您不能使用Math.floor()来代替截断,因为Math.floor(-3.1) = -4而不是-3

截断的正确替代是:

function truncate(value){    if (value < 0) {        return Math.ceil(value);    }    return Math.floor(value);}

#3楼

在您的情况下,当您想要一个字符串结尾(以便插入逗号)时,也可以只使用Number.toFixed()函数,但是,它将执行舍入操作。


#4楼

这里有很多建议。 到目前为止,按位OR似乎是最简单的。 这是另一个简短的解决方案,它也可以使用模运算符处理负数。 比按位OR可能更容易理解:

intval = floatval - floatval%1;

此方法还适用于高值数字,其中'| 0','~~'或'>> 0'均不能正常工作:

> n=4294967295;> n|0-1> ~~n-1> n>>0-1> n-n%14294967295

#5楼

位移0等于除以1

// >> or >>>2.0 >> 0; // 22.0 >>> 0; // 2

#6楼

截断

// Math.trunc() is part of the ES6 specMath.trunc( 1.5 );  // returns 1Math.trunc( -1.5 ); // returns -1// Math.floor( -1.5 ) would return -2, which is probably not what you wanted

舍入

Math.round( 1.5 );  // 2Math.round( 1.49 ); // 1Math.round( -1.6 ); // -2Math.round( -1.3 ); // -1

#7楼

我只想指出,您想通过货币进行舍入,而不是舍弃。 一分钱的可能性很小,因为4.999452 * 100的四舍五入将为您5提供更具代表性的答案。

最重要的是,别忘了 ,这是一种抵消直接舍入带来的轻微积极偏差的方式-您的财务申请可能会要求这样做。


#8楼

另一种可能的方式-使用XOR操作:

console.log(12.3 ^ 0); // 12console.log("12.3" ^ 0); // 12console.log(1.2 + 1.3 ^ 0); // 2console.log(1.2 + 1.3 * 2 ^ 0); // 3console.log(-1.2 ^ 0); // -1console.log(-1.2 + 1 ^ 0); // 0console.log(-1.2 - 1.3 ^ 0); // -2

按位运算的优先级小于数学运算的优先级,这很有用。 尝试


#9楼

如果您使用的是angularjs,那么简单的解决方案如下所示:HTML模板绑定

{

{val | number:0}}

它将val转换为整数

使用此链接


#10楼

如果查看JavaScript中的本机Math对象,您会获得一整套处理数字和值等的函数。

基本上,您想要做的是非常简单的JavaScript本机...

假设您有以下电话号码:

const myValue = 56.4534931;

现在,如果您想将其四舍五入到最接近的数字,只需执行以下操作:

const rounded = Math.floor(myValue);

你会得到:

56

如果要四舍五入到最接近的数字,请执行以下操作:

const roundedUp = Math.ceil(myValue);

你会得到:

57

Math.round也可以将它四舍五入到更高或更低的数字,取决于哪一个更接近浮点数。

您也可以在浮点数后面使用~~ ,它将浮点数转换为整数。

您可以像~~myValue一样使用它...


#11楼

var intvalue = Math.floor( floatvalue );var intvalue = Math.ceil( floatvalue ); var intvalue = Math.round( floatvalue );// `Math.trunc` was added in ECMAScript 6var intvalue = Math.trunc( floatvalue );


例子

// value=x // x=5 5
<5.5 5.5<=x<6 Math.floor(value) // 5 5 5 Math.ceil(value) // 5 6 6 Math.round(value) // 5 5 6 Math.trunc(value) // 5 5 5 parseInt(value) // 5 5 5 ~~value // 5 5 5 value | 0 // 5 5 5 value >> 0 // 5 5 5 value >>> 0 // 5 5 5 value - value % 1 // 5 5 5
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1// value=x            x=900719925474099    x=900719925474099.4  x=900719925474099.5Math.floor(value) //  900719925474099      900719925474099      900719925474099Math.ceil(value)  //  900719925474099      900719925474100      900719925474100Math.round(value) //  900719925474099      900719925474099      900719925474100Math.trunc(value) //  900719925474099      900719925474099      900719925474099parseInt(value)   //  900719925474099      900719925474099      900719925474099value | 0         //  858993459            858993459            858993459~~value           //  858993459            858993459            858993459value >> 0        //  858993459            858993459            858993459value >>> 0       //  858993459            858993459            858993459value - value % 1 //  900719925474099      900719925474099      900719925474099
正数-更大的数字
// x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1 // value=xx=900719925474099 x=900719925474099.4 x=900719925474099.5 Math.floor(value) // 900719925474099 900719925474099 900719925474099 Math.ceil(value) // 900719925474099 900719925474100 900719925474100 Math.round(value) // 900719925474099 900719925474099 900719925474100 Math.trunc(value) // 900719925474099 900719925474099 900719925474099 parseInt(value) // 900719925474099 900719925474099 900719925474099 value | 0 // 858993459 858993459 858993459 ~~value // 858993459 858993459 858993459 value >> 0 // 858993459 858993459 858993459 value >>> 0 // 858993459 858993459 858993459 value - value % 1 // 900719925474099 900719925474099 900719925474099
负数-大数
// x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1 // value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6 Math.floor(value) // -900719925474099 -900719925474100 -900719925474100 Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099 Math.round(value) // -900719925474099 -900719925474099 -900719925474100 Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099 parseInt(value) // -900719925474099 -900719925474099 -900719925474099 value | 0 // -858993459 -858993459 -858993459 ~~value // -858993459 -858993459 -858993459 value >> 0 // -858993459 -858993459 -858993459 value >>> 0 // 3435973837 3435973837 3435973837 value - value % 1 // -900719925474099 -900719925474099 -900719925474099

#12楼

对于截断:

var intvalue = Math.floor(value);

对于回合:

var intvalue = Math.round(value);

#13楼

您可以使用方法不进行舍入。 由于0x(十六进制)和0(八进制)前缀选项,用户输入时要小心。

var intValue = parseInt(floatValue, 10);

#14楼

可以使用双运算符截断浮点数。 您提到的其他操作可通过 , 和 。

> ~~2.52> ~~(-1.4)-1

转载地址:http://lxogj.baihongyu.com/

你可能感兴趣的文章
spring基于注解的 通知&切点配置&数据源配置
查看>>
spring基于注解和基于xml配置文件大全
查看>>
spring 基于注解 和 基于xml管理事务
查看>>
解释@Transactional注解的用法
查看>>
springMVC开发步骤
查看>>
java反序列化漏洞学习之Apache Commons Collections
查看>>
springMVC的工作流程:
查看>>
JAVA学习笔记
查看>>
IDEA-Tips
查看>>
微信小程序 - 遇到的问题
查看>>
Vue+Elementui实现多个表格table合并
查看>>
SpringMVC入门项目
查看>>
初玩Activiti7一套组合拳,连连败退之下竟突破神功,且看SpringBoot整治Activiti7小老弟!
查看>>
Error creating bean with name ‘processEngine‘: FactoryBean threw exception on object creation; nest
查看>>
Tomcat找不到指定的路径D\apache-tomcat-9.0.12\backup\catalina.policy (系统找不到指定的路径).........
查看>>
spring连接c3p0出现错误 Connections could not be acquired from the underlying database!
查看>>
The server cannot or will not process the request due to something that is perceived to be a client
查看>>
unable to process parts as no multi-part configuration has been provided
查看>>
windows按照在idea上使用svn连接服务器遇到E120108: Unable to connect to a repository at URL
查看>>
如果不管你这么换jar包都不行,看这里No converter found for return value of type:
查看>>