问题描述:现有一个node.js程序与c++服务器通讯,c++服务器传过来一个unsigned long long 类型的数据,比如说是104694122807297,node.js这边通过readDoubleBE读出来后是5.172576940057e-310,那么在node这边我要如何将5.172576940057e-310转化为104694122807297?又或者我要在node中发一个64位的数字,比如是104694122807297,我要如何转化为5.172576940057e-310,再通过writeDoubleBE写入一个Buffer中,发给c++服务器?
首先数据类型不对,C++那边是整数类型,javascript却用浮点类型来读,这样做没必要转化了,本身就是错的。楼主没写个C程序么?对数据类型不敏感?好歹你用readIntBE来读啊。
Math.pow(2, 53) // 9007199254740992 其次javascript对整数的精确表示是有范围[-Math.pow(2, 53), Math.pow(2, 53)]的,超过这个范围无法精确表达,如果你是用来记录ID之类的,超过了这个范围就直接用字符串来表示。
在javascript内只有双精度浮点一种数字类型,大整数还是要注意的。一旦超过精确表示范围,就没有办法做精确的四则运算了。
期待标准支持64位整数,在经常用到大数,对精度要求比较高的财务领域,64位整数是必须的,不然的话只能模拟,这个代价又太大了。有了64位整数,ID什么的也方便了许多,不需要再转换为字符串,直接数字比较简单又效率。lua已经在5.3版本区分了浮点数和整数,javascript后续版本应该也会支持的。
用 bigNumber 之类的库吧——在 node 里面所有的数字都是 double。