金币的换算

那种养成类游戏随着时长金币一直在增长,一般都是每增长到1000就用一个字母代替,例如1000 = 1a
1000a = 1b,那我想问下这些要怎么用代码来给i他换算呢,就比如我进游戏总金币数是1b,而升级一个东西需要500a,我要怎么让他们换算并得到剩下的500a

1b只是显示。。
数值还是用1000000

num.string = numberConvertThousand(1000000);

/** 12345 = 12.35K */

public static numberConvertThousand(value: number, fixed: number = 2): string {

    var k = 1000;

    var sizes = ['', 'K', 'M',"B",'T'];

    if (value < k) {

        return value.toString();

    }

    else {

        var i = Math.floor(Math.log(value) / Math.log(k));

        var r = ((value / Math.pow(k, i)));

        return r.toFixed(fixed) + sizes[i];

    }

}
3赞

你这样大的数值不溢出了吗

谢谢 大佬了

数值比较小可以这样用,超大数值,我觉得是每个单位用一个变量保存。比如亿用个变量,值为1的时候表示1亿。

用字符串数字就行,运算的时候用Number(valueStr)来换成数字就不担心溢出了

为了避免大数运算会溢出, 这种天文数字需要使用科学记数法
即实数 * 10的幂次, 可用两个浮点数表达r, n

在做四则运算时, 需要先对齐两个运算元的幂次数使得 n1 == n2,
多出的幂次要乘回 r 数, 接着对 r1 r2 做四则运算即可,
完成后需要归整回科学记数法

字母的表达可以按 n 数简单的转成 [K, M, B, T, …]

大数计算啊,存的是大数,显示的是1b,1a而已

我觉得关键不在于单位,关键还是在于大数的问题,很久以前看过一篇帖子好像说是用的定点数啥的?

数字较大就用字符串表示 重写加减乘除得运算规则就好了 网上也有别人写好的那些文档

尝试过好几种字符串数字计算效率,这个比较好的

字符串大数运算很慢的
不要求大数要100%精确的话, 可以尝试我上述的方法
以前有上线验证过的, 那时是用lua写的项目(cocos2dx)
计算的误差只有在两数数量级差距甚大时才会出现, 基本可以忽略不计

了解下bignumber
https://mikemcl.github.io/bignumber.js/

我在浏览器上输出的,误差有点大啊:

https://github.com/GoogleChromeLabs/jsbi
你值得拥有

你直接用浮点数相减, 当然误差很大…

看样子这种写法跟系统和浏览器也有一定关系?

哪来的浮点数。。。