两个数相乘(包括整数和小数),精度问题

在有精度要求的情况下,进行两数的乘法运算

假设a和b相乘,a、b都有可能是小数,返回相乘的结果(注意精度问题)
举个栗子:a = 4; b = 0.0002 ———— 结果:0.0008

实现代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var a = 4;
var b = 0.0002;
var result = multiplication(a, b);
console.log(result); // 0.0008
function multiplication(num1, num2){
// 首先把两个数转换成字符串(十进制)
var str1 = num1.toString();
var str2 = num2.toString();
// 分别获取两个数的小数位数(确定精度)
var l1 = (str1.indexOf('.') == -1) ? 0 : (str1.length - str1.indexOf('.') - 1);
var l2 = (str2.indexOf('.') == -1) ? 0 : (str2.length - str2.indexOf('.') - 1);
var l = Math.max(l1, l2);
// 根据精度计算结果
var sum = parseFloat(a * b).toFixed(l);
return sum;
}

以上实现过程中用到的一些方法:

parseFloat()方法

该方法可解析一个字符串,并返回一个浮点数;

toFixed()方法

该方法可把Number四舍五入为指定小数位数的数字;

indexOf()方法

该方法可返回某个指定的字符串值在字符串中首次出现的位置:这里,如果这个数不是小数,则str.indexOf(‘.’)返回-1,如果是小数,则返回小数点在字符串中第一次出现的位置;

获取小数位数

str1.length - str1.indexOf(‘.’) - 1,小数的位数 = 字符串的长度 - 小数点第一次在字符串中出现的位置 - 1;举个栗子:123.56(小数位数 = 6 - 3 - 1 = 2);

二进制字符串和十进制之间的转换

  • 十进制转换成二进制字符串:toString()方法
  • 二进制字符串转换成十进制:parseInt()方法
    相关代码:
    1
    2
    3
    var num = 8; // 定义一个十进制的整数
    var str = num.toString(2); // 转换成二进制的字符串,2表示二进制: "1000"
    var num1 = str.parseInt(str,2); // 将二进制字符串转换成十进制的整数,2也表示二进制: 8
扩展

将给定数字转换成二进制字符串,如果字符串长度不足8位,则在前面补0到满8位。
相关代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var a = 8;
var result = changeTo(a);
console.log(result); // "00001000"
function changeTo(num){
var str = num.toString(2);
var l = str.length;
var s1 = "00000000"; // 用于补齐,满8位
if(l < 8){
var s2 = s1.slice(0, 8-l); // 截取需要补齐的位数
str = s2 + str;
}
return str;
}

您的支持将鼓励我继续创作!