TS 自定义结构Long与number类型相互转换

简介: TS 自定义结构Long与number类型相互转换


TS 自定义结构Long 如下:

export interface Long {
/** Low bits */
low: number;
/** High bits */
high: number;
/** Whether unsigned or not */
unsigned: boolean;
} 


根据给定的 Long 接口定义,我们可以实现 Long 类型number 类型之间的相互转换函数


首先,我们可以编写一个将 Long 转换为 number 的函数:

function longToNumber(longValue: Long): number {
  const { low, high, unsigned } = longValue;
  if (unsigned) {
    return (high >>> 0) * 4294967296 + (low >>> 0);
  } else {
    return high * 4294967296 + (low >>> 0);
  }
}


上述函数 longToNumber 接受一个 Long 类型的参数 longValue,并根据 unsigned 属性的值,将其转换为相应的 number 类型。如果 unsignedtrue,我们使用无符号右移操作符 >>> 将低位和高位进行组合;如果 unsignedfalse,我们直接将低位和高位进行组合。


接下来,我们可以编写一个将 number 转换为 Long 的函数:

function numberToLong(numberValue: number): Long {
  const low = numberValue >>> 0;
  const high = Math.floor(numberValue / 4294967296);
  return {
    low,
    high,
    unsigned: numberValue < 0 ? true : false,
  };
}


函数 numberToLong 接受一个 number 类型的参数 numberValue,并根据其值计算出低位和高位。我们使用无符号右移操作符 >>> 取得低位,使用 Math.floor 和除法运算计算出高位。根据 numberValue 的正负值,我们设置 unsigned 属性为相应的布尔值。


现在,我们可以使用上述函数进行 Long 类型和 number 类型之间的相互转换。

const longValue: Long = {
  low: 1234567890,
  high: 0,
  unsigned: false,
};
const numberValue = longToNumber(longValue);
console.log(numberValue); // 输出: 1234567890
const newLongValue = numberToLong(numberValue);
console.log(newLongValue); // 输出: { low: 1234567890, high: 0, unsigned: false }


在上述示例中,我们首先定义了一个 Long 类型的值 longValue,然后使用 longToNumber 函数将其转换为 number 类型的值 numberValue。接着,我们使用 numberToLong 函数将 numberValue 转换回 Long 类型,并将结果存储在 newLongValue 中。

最后,我们分别打印了 numberValuenewLongValue 的值,验证了转换的准确性。

相关文章
|
12天前
|
JSON JavaScript 前端开发
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
解决js中Long类型数据在请求与响应过程精度丢失问题(springboot项目中)
57 0
|
12天前
|
编译器 C语言
c语言中long的作用类型
c语言中long的作用类型
38 0
|
10天前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
实时计算 Flink版产品使用合集之使用JDBC方式读取Oracle的number类型时,通过什么方式进行映射
|
12天前
|
Oracle 关系型数据库 数据库
Flink Sink to Oracle 存在字段CLOB类型,如何处理错误”ORA-01461: 仅能绑定要插入LONG的LONG值“
做Flink CDC同步数据过程中,目标是Oracle数据库,其中某个字段较大被设置为CLOB类型,其中会遇到异常,”ORA-01461: 仅能绑定要插入LONG的LONG值“
|
12天前
|
存储 前端开发 JavaScript
由Long类型引发的生产事故
由Long类型引发的生产事故
|
12天前
|
缓存
Long包装类型的享元模式注意事项
昨天修复订单接口的bug
33 0
|
12天前
|
存储 自然语言处理 安全
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
【C++11保姆级教程】空指针(nullptr),long long类型,char16_t和char32_t类型
|
7月前
|
Java
【面试题精讲】Java超过long类型的数据如何表示
【面试题精讲】Java超过long类型的数据如何表示
|
12天前
|
JSON 前端开发 Java
JAVA后端向前端传递Long类型数据,导致数据不一致
JAVA后端向前端传递Long类型数据,导致数据不一致
117 0
|
12天前
|
数据采集 SQL DataWorks
DataWorks有什么办法将long在search中变成date类型或者是参数里面能配置时间戳吗?
DataWorks有什么办法将long在search中变成date类型或者是参数里面能配置时间戳吗?
50 0