gpt4 book ai didi

javascript - 如何将 BigInt 与 float 相乘?

转载 作者:行者123 更新时间:2023-12-05 03:41:49 26 4
gpt4 key购买 nike

起初我认为是一个简单的问题,结果却是一个脑筋急转弯。

我要解决的问题是:

  • 我有两个文本输入
  • 它们都可以是bigint或float,有很多小数点
  • 我需要将这些数字相乘并生成文本形式的结果(这似乎是唯一安全的选择)

示例输入是:

8958492893478927347298532876489239230849283
0.00000000000023432787489723234848392840923
327984234.4389057390485483859083482390849028390493037

解决此问题的最佳方法是什么?

最佳答案

我认为这应该可行。想法是:

1.- 将数字转换为 BigInt 并保存原始小数位数

2.- 将两个 BigInt 相乘并恢复您在步骤 1 中删除的零。

重要的是要注意 multiply 函数考虑了 4 种情况:

前 3 种情况只是为了允许您管理更大的整数,防止它们中的任何一个在乘法期间变得大于 BigInt 最大长度,在除法期间变得小于 1。

第四种情况考虑了结果可能是 float 的情况,因此不能再使用 BigInt。

注意 1:请记住对输入进行正则表达式,以防止用户添加除数字和单个点之外的任何内容。

注意 2:此代码段已在 Firefox 中成功测试并以纯字符串形式提交 x、y 和 z 值。出于某种原因,这个片段并不能很好地管理 BigInts。

let x = toInt(document.getElementById("x").value.toString());
let y = toInt(document.getElementById("y").value.toString());
let z = toInt(document.getElementById("z").value.toString());

/* getMultiplier rewritten as arrow function, thanks to Bergi */
var getMultiplier = e => 10n ** BigInt(e)

let xy = multiply(x, y)
let xz = multiply(x, z)
let yz = multiply(y, z)

console.log(xy);
console.log(xz);
console.log(yz);

function multiply(a, b) {
let multiplier = getMultiplier(a["dec"]) * getMultiplier(b["dec"])
let ab;
if ((a["int"] > b["int"]) && (a["int"].toString().length > multiplier.toString().length)) {
ab = a["int"] / multiplier * b["int"]
} else if ((b["int"] > a["int"]) && (b["int"].toString().length > multiplier.toString().length)) {
ab = b["int"] / multiplier * a["int"]
} else if ((b["int"].toString().length + a["int"].toString().length) > multiplier.toString().length) {
ab = a["int"] * b["int"] / multiplier
} else {
let missing = multiplier.toString().length - (b["int"].toString().length + a["int"].toString().length) + 1
ab = a["int"] * b["int"] * getMultiplier(missing) / multiplier
/* This number can't be Integer anymore, so we transform the bigint into number */
ab = Number(ab) / Number(getMultiplier(missing))
}
return ab
}

function toInt(e) {
let eArray = e.split(".")
let pair = [];
pair["int"] = BigInt(eArray[0] + (eArray[1] ? eArray[1] : ""))
pair["dec"] = (eArray[1] ? eArray[1].length : 0)
return pair
}
<input type="text" id="x" value="8958492893478927347298532876489239230849283">
<input type="text" id="y" value="0.00000000000023432787489723234848392840923">
<input type="text" id="z" value="327984234.4389057390485483859083482390849028390493037">

关于javascript - 如何将 BigInt 与 float 相乘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67593910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com