首页 > 其他分享 >js小数运算出现的问题(精度丢失)及解决办法

js小数运算出现的问题(精度丢失)及解决办法

时间:2023-05-12 16:23:40浏览次数:43  
标签:解决办法 num1 num2 js break step result 小数

案例:

项目中遇到的问题

购物车结算时,商品价格(33.01)-优惠券价格(5),本应该是28.01,但是实际的结果是28.009999999999998

本案例是在浏览器控制台里打印

 出现的原因:原因其实就是js number类型运算都需要先将十进制转二进制
但小数点后的位数转二进制会出现无限循环的问题,只能舍0入1,所以会出现小数点丢失问题

 

解决方法:

1.保留小数位数toFixed()

 注意:toFixed()保留完是字符串,需要转数字类型

 

2.可以通过先乘10的倍数,然后再除
比如 我要保留两位小数 那我就乘100,运算完后再除100

 虽然繁琐,但是有效

封装成方法

//num1 num2传入两个值  symbol +-*/符号
function amend(num1,num2,symbol){
  var str1=num1.toString(),str2=num2.toString(),result,str1Length,str2Length
    //解决整数没有小数点方法
    try {str1Length= str1.split('.')[1].length} catch (error) {str1Length=0}
    try {str2Length= str2.split('.')[1].length} catch (error) {str2Length=0}
    var step=Math.pow(10,Math.max(str1Length,str2Length))
    // 
    console.log(step);
    switch (symbol) {
        case "+":
            result= (num1*step+num2*step)/step
            break;
        case "-":
            result= (num1*step-num2*step)/step
            break;
        case "*":
            result= ((num1*step)*(num2*step)) / step/step
            break;
        case "/":
            result= (num1*step)/(num2*step)
            break;
        default:
            break;
    }
    return result
    
}
console.log(amend(0.1,0.2,"+"));

 

相关的第三方库:bignumber.js   decimal.js    math.js 等

标签:解决办法,num1,num2,js,break,step,result,小数
From: https://www.cnblogs.com/ddqyc/p/17394595.html

相关文章

  • fastjson中$ref的坑
    相信不少人都遇到过,用fastjson进行序列化时会遇到属性出现$ref的情况,本质是fastjson在处理对象引用时默认不展开,需要自己指定序列化参数。写个DEMO演示一下:1JSONObjectjson=newJSONObject();2JSONObjectprop=newJSONObject();3prop.put("name","test");4pro......
  • JsonObject相关操作
    一:String转JsonObject:JSONObjectjSONObject=JSONObject.parseObject(string);二:获取JsonObject中的value值:System.out.println("111111111"+jSONObject.getJSONObject("Result").getJSONObject("Result").get("FLinkMan"));三:Js......
  • bat中传递JSON参数时,由于JSON包含一些特殊字符如引号、反斜杠等,需要对JSON字符串进行
    在bat中传递JSON参数时,由于JSON包含一些特殊字符如引号、反斜杠等,这些字符可能会导致命令行解释器解析出错。为了避免这些问题,通常建议对JSON字符串进行一些转义处理。具体转义规则如下:对每个双引号(")进行转义,变成"。对每个反斜杠(\)进行转义,变成\。当你传递一个JSON字符串......
  • Auto_Position=1 主库清空部分binlog从库错误(1236)的解决办法
    环境:OS:Centos7DB:mysql5.7.291.从库同步错误如下:mysql>showslavestatus\G;***************************1.row***************************Slave_IO_State:Master_Host:192.168.1.104Master_User:repl......
  • 【转】JavaScript 执行上下文——JS 的幕后工作原理
    转自译文:JavaScript执行上下文——JS的幕后工作原理。译文中图片不显示,要结合原文看,看着不方便。整理了一份含图片的。所以有了此篇的转载,以方便阅读。以下是正文:原文:JavaScriptExecutionContext–HowJSWorksBehindTheScenes,作者:VictorIkechukwu所有JavaScript代......
  • react useReactStore.js
    import{useCallback,useEffect,useMemo,useRef,useState}from'react';import_getfrom'lodash.get';import_setfrom'lodash.set';exportconstKEY_SAVED_TICK_COUNT='KEY_SAVED_TICK_COUNT';exportclassGlo......
  • JS的预解析
    JS的预解析是指在代码执行之前,JavaScript引擎会先对代码进行一次扫描,将变量声明和函数声明提升到当前作用域的顶部,以便在代码执行时能够正确地访问这些变量和函数。这个过程也被称为“提升”。具体来说,在预解析过程中,JavaScript引擎会将函数声明和变量声明提升到当前作用域的顶部......
  • JS 判断电脑是 Win 还是 mac?
    //判断系统类型functionOSnow(){constagent=navigator.userAgent.toLowerCase()constisMac=/macintosh|macosx/i.test(navigator.userAgent)if(agent.indexOf('win32')>=0||agent.indexOf('wow32')>=0){//yourcode......
  • 如何将bash变量传递给JSON
    我正在尝试编写示例脚本,在其中生成诸如"student-101...student-160"之类的名称。我需要发布JSON数据,当我这样做时,出现JSON解析错误。这是我的脚本:123456789name="student-10"for i in {1..1}do   r_name=$name$i   echo $r_name  curl -i -H 'Au......
  • 浅谈 Node.js
    Node.js是什么?Node.js®是一个开源、跨平台的JavaScript运行时环境。官网:https://nodejs.org/zh-cn更多精彩内容,请微信搜索“前端爱好者“,戳我查看。Node.js≠JavaScriptNode.js中,没有BOM和DOM。Nodejs不是一门语言,只是一个跨平台的JavaScript运行时环境。Node......