console.log(0.1+0.2);//输出结果为 0.30000000000000004
简单来说,计算机在内部是以二进制进行存储的,0.1+0.2转二进制都是无限循环小数,计算会精度丢失。
故计算机计算0.1+0.2时,实际上是计算的两个数的二进制和。
废话不多说,四种方式解析0.1+0.2=3
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>0.1+0.2=0.3</title>
</head>
<body>
<!-- 计算机在内部是以二进制进行存储的,0.1+0.2转二进制都是无限循环小数,计算会精度丢失。
故计算机计算0.1+0.2时,实际上是计算的两个数的二进制和。 -->
<script>
//1.化整
var a = 0.1 * 10;
var b = 0.2 * 10;
console.log((a + b) / 10); //输出0.3
//2.toFixed方法——可把Number四舍五入取指定位数的小数点
console.log((0.1 + 0.2).toFixed(1));
//3.ES6的Number.EPSILON——使用两数相加再减去目标数值,结果小于Number.EPSILON即可
console.log(Number.EPSILON > Math.abs(0.1 + 0.2 - 0.3));
// //4.终极
// let num1 = "0.01";
// console.log(num1.length); //(字符串位数)输出 4
// //字符串split函数——可以把一个字符串通过某种规则和标记符号进行分隔,并返回一个数组
// console.log(num1.split(".")[1]); //(点号分隔0.01-[0,01])输出01
function calculate(num1, num2) {
var sum = 0;
if (num1 % 1 === 0 && num2 % 1 === 0) {
sum = num1 + num2;
console.log(sum);
} else if (typeof num1 == "number" && typeof num2 == "number") {
sum = (num1 * 10 + num2 * 10) / 10;
console.log(sum);
} else {
if (num1.split(".").length == 2 && num2.split(".").length == 2) {
sum = (num1 * 10 + num2 * 10) / 10;
console.log(sum);
} else if (
num1.split(".").length == 3 &&
num2.split(".").length == 3
) {
sum = (num1 * 100 + num2 * 100) / 100;
console.log(sum);
} else {
sum = num1 + num2;
console.log(sum);
}
}
}
calculate(0.1, 0.2); //输出 0.3
</script>
</body>
</html>