LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

[转帖]JS中计算出现无限小数位问题

liguoquan
2023年8月12日 10:15 本文热度 402
:JS中计算出现无限小数位问题


JS中计算出现无限小数位问题,浮点数计算精度的问题,四则运算封装

一、原因分析

在工作中遇到了关于金额的计算,用浮点数乘以100结果产生了一堆小数位。之前看过类似的文章,却没有记录下来,总的来说原因就是由于计算机计算会先把数字转换成二进制计算,然后在转换为10进制,导致精度丢失。今天记录一下,以备不时之需。

二、方法封装

  1. 加法

    function add (num1, num2) {
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return false;
    	var r1 = 0, r2 = 0;
    	try {
      		r1 = num1.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	try {
      		r2 = num2.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	var n = Math.pow(10, Math.max(r1, r2));
    	return (num1 * n + num2 * n) / n;}// 测试一下addition(306994.91, 306994.91);// 控制台输出:613989.82

    方法中主要的部分是乘数和最后return的算法,如果不用封装的话,可以自己写一个比较大的数字,比如100000000,先把两个加数分别乘以这个数,这样也可以计算正确,除非你知道你的数字范围,否则不建议这样做。

  2. 减法

    function sub(num1, num2) {  
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
    	var r1 = 0, r2 = 0;
    	try {
      		r1 = num1.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	try {
      		r2 = num2.toString().split(".")[1].length;
    	} catch (e) {
    	}
    	var m = Math.pow(10, Math.max(r1, r2));
      		return (num1 * m - num2 * m) / m;}

    减法运算的原理和加法一样,都是先乘以较大的数字,不多介绍!

  3. 乘法

    function mul(num1, num2) { 
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return; 
    	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);}

    乘法的计算主要是将数字转换为整数相乘再除以10的N次幂

  4. 除法

    function div(arg1, arg2) {
    	if (parseFloat(num1).toString() == "NaN" || parseFloat(num2).toString() == "NaN") return;
    	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) {
    	}
    	r1 = Number(arg1.toString().replace(".", ""));
    	r2 = Number(arg2.toString().replace(".", ""));
    	return (r1 / r2) * Math.pow(10, t2 - t1);}

    主要是先转整型进行计算再除以10的N次幂


该文章在 2023/8/12 10:15:09 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved