js浮点数计算(加,减)

最近工作中经常遇到需要处理浮点型计算的问题,开始一直都在用把浮点数先乘以10的对应小数的位数的次方化成整数再去开始计算。

例如100.01+100.02,可以化成(100.01*100+100.02*100)/100来做计算,但是最近发一个浮点数乘以一个10的次方也会有精度问题发生,突然感觉前面的工作是不是有好多地方埋了很多坑啊,不能愉快的工作啦。

正好周未没什么别的计划,想研究下怎么处理JS的浮点型计算的精度问题

既然浮点数的计算精度有问题,那何不就在计算过程中绕过浮点型的计算了,于是有如下思路



这里是加减法的思路:

可以把数字强行转化成字符串,再取得二个值中小数位数长的那一个长度值,再用字符串的方法把二个字符串中的点号给替换掉,再把位数不够的那一个字符在未尾补零后再把二个字符串转化成数字再进行计算,再把计算的值转换成字符串补上小数点,再转换成数字输出,即绕过了浮点的加减法运算

代码如下:

//浮点数加减法
    function sumfloat(num0,num1,bzstr){
        var ln0,//第一个值的的小数位数
            ln1,//第二个值的的小数位数
            lnz,//小数位数的最大值
            lncz,//小数的差数
            num0str,//第一个值数字转字符
            num1str,//第二个值数字转字符
            resultz;//计算结果
        try {
            ln0=num0.toString().split(".")[1].length;//获取小数位数
        }catch(e){
            ln0=0;
        }
        try {
            ln1=num1.toString().split(".")[1].length;//获取小数位数
        }catch(e){
            ln1=0;
        }
        lnz=Math.max(ln0,ln1);//取得小数位数的最大值
        lncz=ln0-ln1;
        num0str=clearpoint(num0,".");
        num1str=clearpoint(num1,".");
        //根据lncz的正负来判断哪个数字的位数是短的,来走补全
        if(lncz>0){
            num1str=getbq(num1str,lncz);
        }else if(lncz<0){
            num0str=getbq(num0str,Math.abs(lncz));
        }
        //根据传入的符号来判断是做加法还是减法运算
        if(bzstr==="+"){
            resultz=(Number(num0str)+Number(num1str)).toString();
        }else{
            resultz=Number(num0str)-Number(num1str).toString();
        }
        //return resultz;
        return Number(resultz.slice(0,-lnz)+"."+resultz.slice(-lnz));
    }
    //补全0
    function getbq(str,len){
        for(var i=0;i<len;i++){
            str=str+"0";
        }
        return str;
    }
    //浮点型数去小数点转字符串
    function clearpoint(num,str){
        return num.toString().replace(str,"");
    }

测试结果如下:

测试了几个数都没什么大问题。

在线测试地址

个人知识有限,如有不正确的地方,望批评指正,共同学习进步!

时间: 2024-07-30 13:51:21

js浮点数计算(加,减)的相关文章

js浮点数相加、减、乘、除精确计算

js 浮点数计算时 ,无缘无辜 后边冒出一堆 小数点………… 貌似js本身的问题,类型不定?????? 只能自己写函数处理..  http://blog.csdn.net/w4bobo/article/details/9143663 借鉴一下 1 //调用:accAdd(arg1,arg2) 2 //返回值:arg1加上arg2的精确结果 3 function accAdd(arg1,arg2){ 4 var r1,r2,m; 5 try{r1=arg1.toString().split(".&

js浮点数计算问题 + 金额大写转换

一 js浮点数计算问题解决方案: 1.使用 NumberObject.toFixed(num) 方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 2.较精度计算浮点数 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1, arg2) { var r1, r2, m; t

关于js浮点数计算精度不准确问题的解决办法

今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精度的文章.觉得别人写的挺好了,我在简单的总结一下,以方便后续查阅. 浮点数误差产生的原因: 先看一个实例: 0.1 + 0.2 =? 0.1 + 0.2 = 0.3? 我们先来看一段 JS. console.log( 0.1+ 0.2); 输出为 0.30000000000000004.是不是很奇葩

Javascript优化后的加减乘除(解决js浮点数计算bug)

说明 众所周知,js在计算浮点数时候,结果可能会不准确.比如:(在chrome中的运算结果) 2.2 + 2.1 = 4.300000000000001 2.2 - 1.9 = 0.30000000000000027 2.2 * 2.2 = 4.840000000000001 2.1 / 0.3 = 7.000000000000001 网上流传的代码(有bug) 网上流传的优化后的代码如下(有问题的代码,请勿使用) function add(a, b) { var c, d, e; try {

2017-5-26 正则表达式,js实战(加减数量,全选)

1.正则表达式:验证数据格式的准确性. 用正则表达式判断手机号格式是否正确: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml&qu

JS日期时间加减实现

首先,上代码 1 var diffDate = function(date, diff) { 2 return new Date( 3 Date.UTC( 4 date.getUTCFullYear(), 5 date.getUTCMonth(), 6 date.getUTCDate(), 7 date.getUTCHours(), 8 date.getUTCMinutes(), 9 date.getUTCSeconds() 10 ) + 11 diff 12 ); 13 }; 其次,上原理 1

js全局购物车加减全局变量计数

<!DOCTYPE html><html><head><meta charset="utf-8"><title>安心牧羊人</title></head><body> <p>全局变量计数.</p><button type="button" onclick="myFunction1()">-</button>

vue.js 实现购物车加减方法

<template> <div class="coutter-wrapper"> <button type="button" @click="plus">+</button> <button type="button">{{ result }}</button> <button type="button" @click="

【JS】【18】当前时间加减一天,和格式化时间格式

正文: 1,当前时间加减一天 function newDate(num) { var date = new Date();//获取当前时间 date.setDate(date.getDate() + num); //num正数为后一天,负数为前一天 return date : } 2,格式化时间格式 //方法 Date.prototype.Format = function (fmt) { var o = { "M+": this.getMonth() + 1, //月份 "