JAVASCRIPT通过移位操作实现四则运算

本文介绍了一种使用JavaScript处理浮点数运算的方法,通过自定义扩展字符串和数字原型,实现了加、减、乘、除及取模运算的高精度计算。
因项目需要,在前端页面需要对金额进行规则进行运算,用javascript自带的运算浮点数时会出现精度差异,经各种搜索和实验及整理,特此记录以后备用。

/*
* 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而javascript中没有相应的封装类来处理浮点数运算
* 直接计算会导致运算精度丢失。
* 为了避免产生精度差异,把需要计算的数字升级成计算机能够精确识别的整数,等计算完毕再降级,这是大部分编程序
* 语言处理精度差异的通用方法。
*/

/*
* 左补齐字符串
* @param nSize 要补齐的长度
* @param ch 要补齐的字符
*/
String.prototype.padLeft = function(nSize,ch){
var len = 0;
var s = this ? this : "";
ch = ch ? ch : '0';//默认补0
len = s.length;
while(len<nSize){
s = ch + s;
len++;
}
return s;
};
/*
* 右补齐字符串
* @param nSize 要补齐的长度
* @param ch 要补齐的字符
*/
String.prototype.padRight = function(nSize,ch){
var len = 0 ;
var s = this ? this : "";
ch = ch ? ch : '0';//默认补0
len = s.length;
while(len<nSize){
s = s + ch;
len++;
}
return s;
};
/*
* 左移小数点位置 (用于数学计算,相当于除以Math.pow(10,scale)
* @param scale 要移位的刻度
* @return
*/
String.prototype.movePointLeft = function(scale){
var s,s1,s2,ch,ps,sign;
ch = ".";
sign = '';
s = this ? this : "";
if(scale <=0){
return s;
}
ps = s.split('.');
s1 = ps[0] ? ps[0] : "";
s2 = ps[1] ? ps[1] : "";
if(s1.slice(0,1)=='-'){
s1 = s1.slice(1);
sign = '-';
}
if(s1.length<=scale){
ch = "0.";
s1 = s1.padLeft(scale);
}
return sign + s1.slice(0,-scale) + ch + s1.slice(-scale) + s2;
};
/*
* 右移小数点位置 (用于数学计算,相当于除以Math.pow(10,scale)
* @param scale 要移位的刻度
* @return
*/
String.prototype.movePointRight = function(scale){
var s,s1,s2,ch,ps;
ch = '.';
s = this ? this : "";
if(scale<=0){
return s;
}
ps = s.split('.');
s1 = ps[0] ? ps[0] : "";
s2 = ps[1] ? ps[1] : "";
if(s2.length<=scale){
ch = '';
s2 = s2.padRight(scale);
}
return s1 + s2.slice(0,scale) + ch + s2.slice(scale,s2.length);
};
/*
* 移动小数点位置 (用于数学计算,相当于除以Math.pow(10,scale)
* @param scale 要移位的刻度(正数表示向右移,负数表示向左移,0返回返值)
* @return
*/
Strng.prototype.movePoint = function(scale){
if(scale >= 0){
return this.movePointRight(scale);
}else{
return this.movePointLeft(scale);
}
};
/*
* 加法
* @param arg 加数,可以是字符串或数字
*/
Number.prototype.add = function(arg){
var n,n1,n2,s,s1,s2,ps;
s1 = this.toString();
ps = s1.split('.');
n1 = ps[1] ? ps[1].length : 0;

s2 = arg.toString();
ps = s2.split('.');
n2 = ps[1] ? ps[1].length : 0;

n = n1 > n2 ? n1 : n2;
s = Number(s1.movePoint(n)) + Number(s2.movePoint(n));
s = s.toString().movePoint(-n);
return Number(s);
};
/*
* 减法
* @param arg 减数,可以是字符串或数字
*/
Number.prototype.sub = function(arg){
var n,n1,n2,s,s1,s2,ps;
s1 = this.toString();
ps = s1.split('.');
n1 = ps[1] ? ps[1].length : 0;

s2 = arg.toString();
ps = s2.split('.');
n2 = ps[1] ? ps[1].length : 0;

n = n1 > n2 ? n1 : n2;
s = Number(s1.movePoint(n)) - Number(s2.movePoint(n));
s = s.toString().movePoint(-n);
return Number(s);
};
/*
* 乘法
* @param arg 乘数,可以是字符串或数字
*/
Number.prototype.mul = function(arg){
var n,n1,n2,s,s1,s2,ps;
s1 = this.toString();
ps = s1.split('.');
n1 = ps[1] ? ps[1].length : 0;

s2 = arg.toString();
ps = s2.split('.');
n2 = ps[1] ? ps[1].length : 0;

n = n1 + n2;
s = Number(s1.replace('.','')) * Number(s2.replace('.',''));
s = s.toString().movePoint(-n);
return Number(s);
};
/*
* 除法
* @param arg 除数,可以是字符串或数字
*/
Number.prototype.div = function(arg){
var n,n1,n2,s,s1,s2,ps;
s1 = this.toString();
ps = s1.split('.');
n1 = ps[1] ? ps[1].length : 0;

s2 = arg.toString();
ps = s2.split('.');
n2 = ps[1] ? ps[1].length : 0;

n = n1 - n2;
s = Number(s1.replace('.','')) / Number(s2.replace('.',''));
s = s.toString().movePoint(-n);
return Number(s);
};
/*
* 取模
* @param arg 模数,可以是字符串或数字
*/
Number.prototype.mod = function(arg){
var n,n1,n2,s,s1,s2,ps;
s1 = this.toString();
ps = s1.split('.');
n1 = ps[1] ? ps[1].length : 0;

s2 = arg.toString();
ps = s2.split('.');
n2 = ps[1] ? ps[1].length : 0;

n = n1 > n2 ? n1 : n2;
s = Number(s1.movePoint(n)) % Number(s2.movePoint(n));
s = s.toString().movePoint(-n);
return Number(s);
};
内容概要:本文档详细介绍了基于直驱永磁同步发电机(PMSG)的1.5MW风力发电系统在Simulink环境下的建模与仿真全过程,涵盖了风力机空气动力学模型、PMSG电磁特性建模、不可控整流与逆变电路、直流环节、空间矢量脉宽调制(SVPWM)技术以及核心控制策略的设计。重点实现了最大功率点跟踪(MPPT)控制以提升风能捕获效率,并构建了电压外环与电流内环协同工作的双闭环控制系统,通过仿真验证了系统在不同风速条件下稳定运行的能力及动态响应性能。; 适合人群:适用于具备电力系统、电机控制理论基础及Simulink仿真操作经验的研究生、科研人员和从事新能源发电系统开发的工程技术人员;特别适合正在进行风电系统建模、控制算法研究或完成相关毕业设计的专业人士。; 使用场景及目标:①深入理解直驱式PMSG风力发电系统的整体架构与工作机理;②掌握从物理部件建模到控制策略实现的完整Simulink仿真流程;③学习并复现MPPT控制、双闭环控制等关键技术方案;④为后续开展低电压穿越、并网稳定性分析、故障诊断等高级课题提供可靠的仿真平台支撑。; 阅读建议:建议结合Matlab/Simulink软件动手实践,逐模块搭建模型,重点关注各控制环节的参数设计与调试方法,同时可参照文中提供的其他风电相关资源进行拓展学习与对比分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值