javascript(js)小数精度丢失的解决方案

news/2024/7/19 15:30:20 标签: JS, javascript, 精度丢失

原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况.

javascript(js)的小数点加减乘除问题,是一个js的bug如0.3*1 = 0.2999999999等,下面列出可以完美求出相应精度的四种js算法

javascript">function accDiv(arg1,arg2){   
 var t1=0,t2=0,r1,r2;   
 try{t1=arg1.toString().split(".")[1].length}catch(e){}   
 try{t2=arg2.toString().split(".")[1].length}catch(e){}   
 with(Math){   
 r1=Number(arg1.toString().replace(".",""))   
 r2=Number(arg2.toString().replace(".",""))  
 return accMul((r1/r2),pow(10,t2-t1));   
 }   
 }   /* 何问起 hovertree.com */
  //乘法  
  function accMul(arg1,arg2)   
  {   
  var m=0,s1=arg1.toString(),s2=arg2.toString();   
  try{m+=s1.split(".")[1].length}catch(e){}   
  try{m+=s2.split(".")[1].length}catch(e){}   
  return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)   
  }   
//加法   
function accAdd(arg1,arg2){   
var r1,r2,m;   
try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}   
try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}   
m=Math.pow(10,Math.max(r1,r2))   
return (arg1*m+arg2*m)/m   
}   
//减法   
function Subtr(arg1,arg2){  
    var r1,r2,m,n;  
    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}  
    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}  
    m=Math.pow(10,Math.max(r1,r2));  
    n=(r1>=r2)?r1:r2;  
    return ((arg1*m-arg2*m)/m).toFixed(n);  
}

 

转自:https://www.cnblogs.com/roucheng/p/jsjingdu.html


http://www.niftyadmin.cn/n/861121.html

相关文章

看完这篇 “原型” “this”,就两字“通透了”

主题 今天想跟大家分享一个比较 "别扭" 的概念:“原型 & this” 。 想把这玩意儿给说清楚,大多都会感到头大。用的时候也会遇到些尴尬的场景。就很难去整明白,这到底是个啥。 这一期,就试着将这 说个清楚&#x…

Android安卓 + webview + vue 实现图片上传

前提:需要首先实现web端的网页上传图片(只要网页上传图片成功,后续集成和android部分的相关操作,就可以成功实现图片上传) 步骤: web端实现网页上传web嵌入安卓webview实现安卓手机拍照和选择图片上传 问…

高级前端-JS进阶-设计模式

设计模式分类 创建型模式: 工厂模式: 建造者模式: 单例模式: 结构型模式: 享元模式: 桥接模式: 适配器:console.log变成mylog 装饰器:dom绑定的click事件的增加操作&…

手写promise骨架

var p1 new Promise((resolve, reject) > {resolve(1) }) p1.then((val) > {console.log(val) }, (reason) > {console.log(reason) }) p1.then(2) // 通过onfulfulled里面的return的值,修改promise // x是promise,resolve的值,rej…

高级前端-Vue组件世界

1. 自定义指令 2. 数据双向绑定::value input v-model作用于表单元素 自定义组件使用v-model之后,父组件不用再监听子组件的事件触发 .sync语法糖 3. 组件通信 1. 跨层级访问:$emit,组件过多时会很麻烦,vue提供了…

高级前端-Vue源码分析

1. Vue的响应式原理 let nextTick (cb) > Promise.resolve().then(cb) let flushJobs [] function queueJob(dep) {flushJobs.push(dep)// 微任务,最后执行,真正执行数据操作函数nextTick(flushJobs) } function flushJobs(job) {// 拿出队列中的所…

高级前端-vue的主流插件

1. Vuex Mutations是修改数据的唯一方法 2. Vue Router hash history

高级前端-Babel

Babel是什么?是个编译器,把高版本js代码变成低版本js代码 编译过程,把原代码通过词法分析变成一个个token,举例:ab则拆成了a,,b三个token 语法分析器把这些token根据对应的语法生成抽象语法🌲 语义分析器…