如何使用JavaScript在QtQuick Qml中进行大数运算

如何使用JavaScript在QtQuick Qml中进行大数运算,javascript,bash,qt,math,qml,Javascript,Bash,Qt,Math,Qml,我想计算一下太阳围绕银河系的情况;数学公式是((241828072282107.5071453596951*666)*2)*3.14159265359,使用QML JavaScript我得到答案1011954093357316100,当正确答案是1011954093357316200时,距离100英里 galaxyRadius="241828072282107.5071453596951"; currentTrackNumber=666; // Track Number like on a R

我想计算一下太阳围绕银河系的情况;数学公式是((241828072282107.5071453596951*666)*2)*3.14159265359,使用QML JavaScript我得到答案1011954093357316100,当正确答案是1011954093357316200时,距离100英里

galaxyRadius="241828072282107.5071453596951";

currentTrackNumber=666; // Track Number like on a Record

pIe="3.14159265359"; // not the same as Math.PI
我不得不使用字符串,因为将这些大小的数字转换为浮点数会截断精度,我正在转换一个旧的bash脚本,它在bc中运行良好,没有太多的数学运算

我试过这个:

orbitDist = ((( Number.parseFloat(galaxyRadius).toPrecision(20) * currentTrackNumber) * 2) * Number.parseFloat(pIe).toPrecision(12) );
我得到的结果与:

orbitDist = ((( galaxyRadius * currentTrackNumber) * 2) * pIe );
来自bash:

echo "$(bc <<< "scale=13;((241828072282107.5071453596951 * 666) * 2) * 3.14159265359")"

echo“$(bc因为JavaScript现在只支持integer()的bignum。然后我在计算之前将其转换为BigInt。并跟踪小数部分以重新转换为float

const galaxydradius=“241828072282107.5071453596951”; const currentTrackNumber=666;//类似于记录上的轨迹号 const pIe=“3.14159265359”;//与Math.PI不同 常数orbitDist=((galaxyRadius*currentTrackNumber)*2)*pIe); 控制台日志(orbitDist) ////我的认可 //将所有数字放入一个数组 var arrToMul=[galaxyRadius,currentTrackNumber,2,pIe] //函数使用BigInt格式在数组中多个all项 函数mulBigInt(arr){ 返回arr.reduce(功能(acc,e){ 返回BigInt(e)*acc; },BigInt(1)); }; //函数获取小数部分的长度 函数长度(str){ var dec=str.toString().split('.')[1]; 返回十二月?十二月长度:0; }; //函数删除字符串中的点以将浮点转换为int 功能rmPoint(strNum){ 返回strNum.toString(); }; //主要功能 功能校准(arr){ //获取所有数字的总小数部分长度 var pointSize=arr.reduce(函数(acc,e){ 返回acc+decLength(e); }, 0); //将所有项转换为int(类型字符串) var newArr=arr.map(函数(e){ 返回点(e); }); //添加点以将BigInt重新转换为float(实际为字符串) var tmp=mulBigInt(newArr).toString().split(“”); tmp.拼接(tmp.长度-点大小,0’,); //以字符串格式返回浮点结果 返回tmp.join(“”); }; 常数rs=cal(arrToMul)
console.log(rs,'converted to BigInt:')
JavaScript精度对于您的大量数据来说还不够好。我假设您研究了各种可以解决精度问题的大型*库?().我指的是上面的这个,它不是为Qml JavaScript编写的,要让它没有错误或警告需要做很多工作,我从删除“use strict”开始",并将==更改为===等等,但遇到使用前未定义的变量的问题,并且修复其中一些变量会导致更多问题,它可以转换,以前从未这样做过,希望有一个为Qml制作的库。@user83395 In,因此您不应该将已解决的问题添加到问题的标题中,而应该标记该任务ion帮助您解决了问题,如果您找到了解决方案,我们将邀请您发布一个解决方案,并在2天内将其标记为正确,有关更多信息,请查看:-)QtCreator Qml JavaScript被arrow函数表达式阻塞,我将必须找出如何将其转换为常规函数调用,除非你能更新你的答案在QtCreator中工作,从未使用过箭头函数,我确实从研究中发现它们在Qml中不起作用,但现在不知道如何转换,我会研究它,答案是正确的,所以这只是让它在Qml中工作的问题。感谢,伟大的工作,不知道这一点,正在工作的C++解决方案,像这样更好,更精确。user83395我更新了答案,将箭头函数转换为普通函数。希望有帮助。谢谢,关闭,只是在BigInt前面添加new,一些关于使用以大写字母开头的new-before函数的警告,然后我得到了一个BigInt未定义的错误,看,这似乎是内置的,google没有帮助找到解决方案,Qml JavaScript与Web不同,你知道我是否需要导入它,如果需要,如何导入?感谢所有的帮助,我想你是用QT创建者来工作的,假设你知道这意味着什么。我在C++中的努力给了我101195409335731609,比JavaScript更糟糕,好像64个比特是不够的,而且是使用了一个双,接下来我必须去查看任意精确的数学库,我希望我可以使用BigIt,谷歌帮不了什么忙,我能找到的只是网络使用,而不是Qml。我发现我在使用任何JavaScript解决方案时都会遇到一个问题,那就是任何时候你必须做任何涉及浮点的数学运算,或者你必须出于任何原因转换成浮点,你会遇到精度问题,BigInt展示的,效果很好,但是我不知道如何在Qml、Qt状态下使用它来查找JavaScript示例,当大多数都不起作用时,BigInt就是其中之一,加上有一个“this”bug需要处理,所以我切换到boost math multiprecision,我有一个问题,另一个线程,但它确实给了我正确的答案,所以感谢所有的帮助。