js位数多跟精度丢失问题

大佬能给个解决方案吗 @jare

底层无法进行这样的整体迁移,就算是其他编程语言应该也没有这个功能。大数处理最好还是自己在业务层进行。其实你遇到的问题我估计都用不着这种大规模的调整,可以说说你具体要解决什么问题。

怎么会想到改底层啊,你们有些人提的问题真是越看越气人。
别人给你推荐汽油车电动车,你非要给骡子屁股上装个发动机
真的,建议你们遇到问题多思考,别一上来就提需求
这个论坛里90%的技术问题都跟技术没一毛钱关系

1赞

就类似于捕鱼的游戏大厅,主要是money跟bet把,但已经做了200+台机器(排除活动)金币都是本地计算,如果要支持必须把钱改成bignumber,就要把200+机器同时改掉,否则之前的加号会变成字符串相加,因为无法重写+运算符,整体工作量比较大后期测试也很麻烦,可能稍微漏掉一个地方玩家的钱就会变得很大一旦出错游戏基本就玩完了。
我们老的项目用的spidermonkey,或者v8,都是js,规定这样, 是不是只能通过逐步修改业务去改了 :rofl:

还有有个自带的bigint的这个似乎可以直接 用+号运算很大的数,这个是哪个js版本可以吗

es11呀 我嚓

var a = BigInt(3443434343); console.log(a+1)

Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions

也是不能混合使用,完蛋

官方瑟瑟发抖!!!准备删帖

刚又搜了下,所有语言php go lua js等都用的 ( IEEE 754 )标准,都会遇到此问题,但也都有对应的大数要自己做修改的问题

只能改业务,改整个 js 虚拟机的话游戏可能会卡死(更何况没人知道怎么改)

1赞

好的~收到

遇到问题发到社区寻求解决方案或者看看大家是否有更好的想法不是很正常吗?

这种计算函数.不是应该抽出来建立公共方法么?

Number.prototype.toBig = function () {
var x = this;
if (Math.abs(x) < 1.0) {
var e = parseInt(x.toString().split(‘e-’)[1]);
if (e) {
x *= Math.pow(10, e - 1);
x = ‘0.’ + (new Array(e)).join(‘0’) + x.toString().substring(2);
}
} else {
var e = parseInt(x.toString().split(’+’)[1]);
if (e > 20) {
e -= 20;
x /= Math.pow(10, e);
x += (new Array(e + 1)).join(‘0’);
}
}
return x;
}
//将科学计数e转为不带e的方法扩展记录一下

你这不叫 toBig,而且转成非科学计数法对提升精度也没有帮助。因为返回的是一个字符串。既然都是字符串了,又无所谓是否是科学计数的?而且最终运算还不是得转成 Number 才能参与运算。

这是项目太大没法直接改bignumber,精度丢了就丢了,但是之前的显示变成科学计数那种字体的文字就直接变成1了,这里只是记录一下代码,保证显示先正常。
精度问题只能用字符串存,加减乘除分别拆开保留16位用进位的方法单独计算即引用第三方bignumber库

1赞

运算用BigInt,存储数值用string

IEEE754浮点数都有精度问题。你不考虑计算性能的吗?哪怕是后来ES提供的内置BigInt性能也是拉跨,更别说bignumber.js和big.js了。
让引擎用bignumber.js怕是要卡成ppt。
这图是之前我做测试里其中一个简单的整数累加。
shotscreen01

1赞

这个做在原生里有试过性能吗,在ts js lua端是很拉胯

https://www.bookstack.cn/read/es6-3rd/spilt.9.docs-number.md
ES2020 引入了一种新的数据类型 BigInt(大整数).这个不知道能不能用

装个B, 这个和v8也关系, 精度问题和CPU指令编码有关系, 只有CPU厂商才能搞