contorno
1.了解原因
2.解决方案
1. Motivo
Porque en las computadoras, los números se convierten primero a binario, luego a aritmética y finalmente a decimal.
Por ejemplo: 0.1 + 0.2
0.1 也就是0.0001100110011001100110011001100110011001100110011001101
0.2 也就是0.001100110011001100110011001100110011001100110011001101
即:
0.00011001100110011001100110011001100110011001100110011010 +
0.0011001100110011001100110011001100110011001100110011010 =
0.0100110011001100110011001100110011001100110011001100111
El resultado 0.0100110011001100110011001100110011001100110011001100111 y convertido a decimal es 0.300000000000000004.
2. Soluciones
(1) Complemento decimal
0.1 + 0.2 // 0.30000000000000004
x = new Decimal(0.1)
y = x.plus(0.2) // '0.3'
(2) Número grande del complemento
x = new BigNumber(0.1)
y = x.plus(0.2)
(3) convertirse en un número entero
function add(num1, num2) {
const num1Len = (num1.toString().split('.')[1] ).length;
const num2Len = (num2.toString().split('.')[1] ).length;
const maxLen = Math.pow(10, Math.max(num1Len, num2Len));
return (num1 * maxLen + num2 * maxLen) / maxLen;
}