浮点数精度问题解决方案-加减乘除

  1 <html></html>
  2 <script>
  3     // 0.1+0.2
  4     let a = null,
  5         b = null;
  6     a=0.1
  7     b=0.2
  8     function sum(a,b){
  9         return a+b
 10     }
 11     // console.log(sum(a,b)) // 0.30000000000000004
 12     // 思路,通过放大倍数再缩小
 13     let times1 = 10
 14     // console.log(sum(a*times1,b*times1)/times1)  // 0.3
 15     // 引出问题,该放大多大倍数
 16     // 从上述可以看出a扩大了10的小数部分长度的幂  a整数部分长度为1,扩大倍数为10,参数b同理扩大
 17     // 假如是0.1+0.02
 18     // console.log(sum(0.1,0.02)) // 0.12000000000000001
 19     let times2 = 100
 20     // console.log(sum(0.1*times2,0.02*times2)/times2) // 0.12
 21     // 通过再次分析,可知,扩大倍数=10的相加参数小数部分长度最大的次幂
 22     // 引出两个方法
 23     //  1.Math.pow(x,y) x的y次幂
 24     //  2. Math.max(x...) 取最大的值
 25     // 封装函数 加法
 26     function  accuracySum(a,b) {
 27         if(a === undefined || b === undefined) {
 28             return console.log('a或b不存在')
 29         }
 30         // 定义a,b 小数部分的长度
 31         let lenA = 0,
 32             lenB = 0;
 33         // 将a,b类型转化成string
 34         let strA = typeof a === 'string' ? a :a.toString(),
 35             strB = typeof b === 'string' ? b : b.toString();
 36         if(strA.indexOf('.')!== -1) {
 37             lenA = strA.split('.')[1].length > 0 ? strA.split('.')[1].length : 0
 38         }
 39         if(strB.indexOf('.')!== -1) {
 40             lenB = strB.split('.')[1].length > 0 ? strB.split('.')[1].length : 0
 41         }
 42         // 倍数
 43         let times = Math.pow(10,Math.max(lenA,lenB))
 44         // console.log(times,'【times】',a*times,b*times,lenA,lenB)
 45         return (a*times+b*times)/times
 46     }
 47     console.log('【accuracySum】',accuracySum(-1.1,0.2))
 48     // 封装函数 减法
 49     function accuracySubtraction(a,b) {
 50         if(a === undefined || b === undefined) {
 51             return console.log('a或b不存在')
 52         }
 53         // 定义a,b 小数部分的长度
 54         let lenA = 0,
 55             lenB = 0;
 56         // 将a,b类型转化成string
 57         let strA = typeof a === 'string' ? a :a.toString(),
 58             strB = typeof b === 'string' ? b : b.toString();
 59         if(strA.indexOf('.')!== -1) {
 60             lenA = strA.split('.')[1].length > 0 ? strA.split('.')[1].length : 0
 61         }
 62         if(strB.indexOf('.')!== -1) {
 63             lenB = strB.split('.')[1].length > 0 ? strB.split('.')[1].length : 0
 64         }
 65         // 倍数
 66         let times = Math.pow(10,Math.max(lenA,lenB))
 67         // console.log(times,'【times】',a*times,b*times,lenA,lenB)
 68         return (a*times-b*times)/times
 69     }
 70     console.log('【accuracySubtraction】',accuracySubtraction(-1.1,-0.2)) // -0.9
 71     // 封装乘法
 72     function accuracyMulti(a,b) {
 73         if(!a || !b) {
 74             return
 75         }
 76         if(a === 0 || b === 0) {
 77             return 0
 78         }
 79       // 定义a,b 小数部分的长度
 80       let lenA = 0,
 81           lenB = 0;
 82         // 将a,b类型转化成string
 83       let strA = typeof a === 'string' ? a :a.toString(),
 84           strB = typeof b === 'string' ? b : b.toString();
 85       if(strA.indexOf('.')!== -1) {
 86             lenA = strA.split('.')[1].length > 0 ? strA.split('.')[1].length : 0
 87         }
 88       if(strB.indexOf('.')!== -1) {
 89             lenB = strB.split('.')[1].length > 0 ? strB.split('.')[1].length : 0
 90         }
 91         // 倍数
 92         let times = Math.pow(10,Math.max(lenA,lenB))
 93         // console.log(times,'【times】',a*times,b*times,lenA,lenB)
 94         return (a*times)*(b*times)/(times*times)
 95     }
 96     console.log(accuracyMulti(0.1,0.02),'【accuracyMulti】') // 0.002
 97 
 98        // 封装除法
 99        function accuracyDivision(a,b) {
100         if(!a || !b) {
101             return
102         }
103         if(a === 0 || b === 0) {
104             return 0
105         }
106       // 定义a,b 小数部分的长度
107       let lenA = 0,
108           lenB = 0;
109         // 将a,b类型转化成string
110       let strA = typeof a === 'string' ? a :a.toString(),
111           strB = typeof b === 'string' ? b : b.toString();
112       if(strA.indexOf('.')!== -1) {
113             lenA = strA.split('.')[1].length > 0 ? strA.split('.')[1].length : 0
114         }
115       if(strB.indexOf('.')!== -1) {
116             lenB = strB.split('.')[1].length > 0 ? strB.split('.')[1].length : 0
117         }
118         // 倍数
119         let times = Math.pow(10,Math.max(lenA,lenB))
120         // console.log(times,'【times】',a*times,b*times,lenA,lenB)
121         return (a*times)/(b*times)
122     }
123     console.log(accuracyDivision(0.1,0.002),'【accuracyMulti】') // 50
124 </script>

 

posted @ 2021-10-12 22:13  阿哲淘小子  阅读(145)  评论(0编辑  收藏  举报