javascript - 将 Double64 转换为 Long64 并返回 JavaScript
问题描述
我需要将 Double64 转换为 Long64 并返回到 JavaScript,例如 Java 上的 Double.doubleToLongBits() 和 Double.longBitsToDouble()。并且方法的结果必须与Java中的相同。例如 1435.036452 -> 4654026172507377535 -> 1435.036452,或 -1435.036452 -> -4569345864347398273 -> -1435.036452。据我了解,我的代码可以很好地将 Double64 转换为 Long64,但我无法取回我的价值。Double64 到 Long64:
function toString64bitFloat(number) {
if(number === undefined || isNaN(number))
return 0;
let result = "";
const dv = new DataView(new ArrayBuffer(8));
dv.setFloat64(0, number, false);
for (let i = 0; i < 8; i++) {
let bits = dv.getUint8(i).toString(2);
if (bits.length < 8)
bits = new Array(8 - bits.length).fill('0').join("") + bits;
result += bits;
}
return result;
}
function stringToLong64(bitString) {
if(bitString === undefined || isNaN(bitString))
return 0;
let result = new BigInt64Array(1);
result[0] = BigInt(0);
if(bitString[0] === "1"){
for(let i = bitString.length; i > 0; i--)
if(bitString[i] === "0")
result[0] += BigInt(Math.pow(2, 63 - i));
result[0] = -result[0] - BigInt(1);
}else{
for(let i = bitString.length; i > 0; i--)
if(bitString[i] === "1")
result[0] += BigInt(Math.pow(2, 63 - i));
}
return result[0];
}
Long64 到 Double64:
function toString64bitInt(number) {
let result = "";
let temp = number;
if(temp > 0){
result += "0";
for(let i = 1; i < 64; i++){
if(temp - BigInt(Math.pow(2, 63 - i)) >= 0){
result += "1";
temp -= BigInt(Math.pow(2, 63 - i));
} else {
result += "0"
}
}
} else {
result += "1";
temp = -temp + BigInt(0);
for(let i = 0; i < 63; i++){
if(temp - BigInt(Math.pow(2, 63 - i)) >= 0){
result += "0";
temp -= BigInt(Math.pow(2, 63 - i));
} else {
result += "1"
}
}
}
return result;
}
function stringTofloat64(bitString) {
let result = new Float64Array(1);
result[0] = 0.0;
if(bitString[0] === '1'){
for(let i = 1; i > 12; i++)
if(bitString[i] === '0')
result[0] += Math.pow(2, 11 - i);
for(let i = 12; i > 64; i++)
if(bitString[i] === '0')
result[0] += Math.pow(2, -(52 - i + 12));
result[0] = -result[0];
}else{
for(let i = 1; i > 12; i++){
if(bitString[i] === '1'){
result[0] += Math.pow(2, 11 - i);
}
}
for(let i = 12; i > 64; i++)
if(bitString[i] === '1'){
result[0] += Math.pow(2, -(52 - i + 12));
}
}
return result[0];
}
解决方案
推荐阅读
- javascript - React - 将api调用结果返回给原始函数
- vba - 错误处理 For 循环 - 下标超出范围
- list - 循环查询集不会追加到列表
- lua - 如何在 Roblox Lua 中制作 2D GUI?
- sql - Postgres 查询 DISTINCT 两列中的任何一列
- kotlin - 如何在 kotlin 映射函数中强制转换显式命名的 lambda 参数
- discord - Discord.py 中的 bot.wait_for() 从任何机器人发送的消息中读取反应
- python - Django 管理员“登录为”按钮
- java - 如何放心地将布尔值作为 json 正文发送
- mysql - 如何在 Rails Active Record 中保存对象时更新相关属性