分享一个模拟64位整数类(实现大小比较,+-法,支持负数)

风声3 2015-01-02 12:16:53
做快递单的计算,花了几个小时写了一个类,最后被告知还有含字母的单号,似乎用不上了,发这记录一下。
应用示例:

var a= new _Int64("128765431123123");
var b= new _Int64("7343453405434");
var c= new _Int64"-3453454345634534");
a.Plus(b); // a+=b; 的效果
alert(a.ToString());
b.Minus(c); // b-=c; 的效果
alert(b.ToString());
switch(a.Compare(b)){
case 0:alert("a=b");break;
case 1:alert("a>b");break;
case -1:alert("a<b");break;
}

类源码:

function _Int64(str) {
this.IsNeg = str[0] == "-";
this.Data = new Array();
for (var i = this.IsNeg ? 1 : 0; i < str.length; i++) {
var n = parseInt(str[i]);
if (this.Data.length > 0 || n > 0) this.Data.push(n);
}
if (this.Data.length == 0) this.Data.push(0);

this.ToString = function () { return (this.IsNeg ? "-" : "") + this.Data.join(""); };
this.Plus = function (b) { if (this.IsNeg == b.IsNeg) { DataPlus(this, b); } else { DataMinus(this, b); } };
this.Minus = function (b) { if (this.IsNeg == b.IsNeg) { DataMinus(this, b); } else { DataPlus(this, b); } };
this.Compare = function (b) { return (this.IsNeg == b.IsNeg ? DataCompare(this, b) : 1) * (this.IsNeg ? -1 : 1); };

function DataPlus(a, b) {
var x = a.Data.length;
var y = b.Data.length;
var l = x > y ? x : y;
var z = 0; x--; y--;
for (var i = 0; i < l; i++) {
var n = (x < 0 ? 0 : a.Data[x]) + (y < 0 ? 0 : b.Data[y--]) + z;
z = n < 10 ? 0 : 1;
if (x < 0) a.Data.splice(0, 0, n % 10); else a.Data[x--] = n % 10;
if (y < 0 && z == 0) break;
}
}
function DataMinus(a, b) {
var c = DataCompare(a, b);
if (c == 0) { a.Data = [0]; a.IsNeg = false; return; }
a.IsNeg = c == (a.IsNeg ? 1 : -1);
var x = a.Data.length;
var y = b.Data.length;
var l = x > y ? x : y;
var z = 0; x--; y--;
for (var i = 0; i < l; i++) {
var n = ((x < 0 ? 0 : a.Data[x]) - (y < 0 ? 0 : b.Data[y--]) - z) * c;
if (n < 0) { z = c; n += 10; } else { z = 0 };
if (x < 0) a.Data.splice(0, 0, n); else a.Data[x--] = n;
if (y < 0 && z == 0) break;
}
while (true) { if (a.Data[0] == 0) a.Data.splice(0, 1); else break; };
}
function DataCompare(a, b) {
var x = a.Data.length;
var y = b.Data.length;
if (x > y) return 1; else if (x < y) return -1;
else for (var i = 0; i < x; i++) {
if (a.Data[i] > b.Data[i]) return 1;
else if (a.Data[i] < b.Data[i]) return -1;
}
return 0;
}
}

_Int64.Test = function (str) { return /^-?[0-9]+$/.test(str); };
...全文
136 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
风声3 2015-01-03
  • 打赏
  • 举报
回复
随手写的示例露了一个括号(: var c= new _Int64"-3453454345634534"); 应该是 var c= new _Int64("-3453454345634534");
xuzuning 2015-01-03
  • 打赏
  • 举报
回复
IE 输出 0 0 a=b
hookee 2015-01-02
  • 打赏
  • 举报
回复

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧