本文中采用的代码示例都为javaScript代码
最近在刷一些javaScript的相关题目,过程中一个坑爹的细节问题让我很无语,代码如下:
let num_1 = 0.8;
let num_2 = 0.2;
console.log(num_1 - num_2 === 0.6);//false
之前自己对数据类型这一块没有整体的理解,无论是什么编程语言,计算机处理数据所使用二进制01代码无法准确表示某些带小数位的十进制数据。
整数部分转换成二进制是“除二取余”法。
小数部分转换成二进制是"乘二取整"法。
(0.65)10 = (0.101001100110011001100110011001100110011......)2
即二进制代码在现有精度(float - 32位,double - 64位)无法正确表示0.65这个数据。
想要避免这样的问题,可以采用以下一些方式规避:
- 将数据乘以10或者100变成整数,做完整数运算再除以10或者100
let num_1 = 0.8;
let num_2 = 0.2;
console.log((num_1 * 10 - num_2 * 10) / 10 === 0.6 ); //true
或者利用数学函数,四舍五入成为整数
console.log(Math.round((num_1 - num_2) * 10) / 10);//true
- 通过截取有效的小数位,设置指定数值精度
let num_1 = 0.8;
let num_2 = 0.2;
let result = num_1 - num_2;
console.log(result.toFixed(1) === 0.6);//true
目前可以想到的实现就这两种,如果大家还有什么好的解决实现方案可以交流!