浮点数处理
1.JavaScript中的Number(double64)遵循IEEE754标准,现代cpu都遵循IEEE_754标准,误差是稳定的。
console.log(0.1+0.2) //不同平台计算结果一样 0.30000000000000004
2.Math.PI和三角函数在不同平台上计算结果不同(iOS误差明显),因此不能直接使用这些数学库,要使用查表法。
3.使用确定性随机数。
function syncRand(seed) {
return function() {
seed = (seed * 9301 + 49297) % 233280;
return seed / 233280.0;
};
}
let rand = syncRand(18);
console.log(rand());
console.log(rand());
console.log(rand());
4.截断小数位数(不是必须的)。
5.要注意日志输出结果精度不高。
console.log(0.1 + 0.2); //0.30000000000000004
console.log(3.142) //网页输出3.142 原生平台输出3.1419999999999999
//C++代码
#include <iostream>
int main(){
double a = 0.1;
double b = 0.2;
double c = 0.1 + 0.2;
std::cout << c;
if (c == 0.30000000000000004) {
std::cout << "Hello World!\n";
}
return 0;
}
//输出:0.3Hello World!
6.游戏过程中作弊检测。
玩家每隔一段时间把所有角色的关键数据加密为MD5上传服务器,服务器进行比对。如果是所有人上传上来的MD5都一样说明所有人的游戏结果都是同步的,如果有人修改了血量那么就会造成游戏不同步自己的MD5和其他人的不一样,服务器可以强行纠正它或者踢掉它。