网上搜的答案是自己写了个biginteger的类,但是为什么不用long呢?是因为效率的问题吗?没感觉对效率有什么影响!
package com.wjl.test; public class BigInteger { /** * 用int来表示符号 * byte[]来表示其中的二进制数 * */ int sign; byte[] val; public BigInteger(String val){ sign=0; val=null; } /** * 下面是加减乘除的各个方法! * 恕我没有看懂! * 上面的一个构造函数是如何表示出属于一百亿以内的任何数字的!!!!! * */ }
下面是我以前写的一个计算长数据的计算器的一部分,原则上,可以计算任意大的数据,只是时间可能会稍长,比如计算1024的1024次方开10个线程计算需要3分钟多的,当然我只给了你加法,其它的你自己按小学课本上的减乘除的方法计算就行了。
//这是一个长数据类 public class LongNumber { public NumberFlag Flag { get; set; } public string Number { get; set; } public LongNumber() { this.Flag = NumberFlag.Zero; this.Number = "0"; } public LongNumber(string number) { if (!LongNumber.CheckNumber(number)) throw new InvalidCastException("Input not is a number."); this.Flag = NumberFlag.Positive; this.Number = number; } public LongNumber(NumberFlag flag, string number) { if (!LongNumber.CheckNumber(number)) throw new InvalidCastException("Input not is a number."); this.Flag = flag; this.Number = number; } public override string ToString() { if (LongNumber.EqualsZero(this)) return "0"; else { return string.Format("{0}{1}", this.Flag == NumberFlag.Positive ? string.Empty : "-", this.Number.TrimStart('0')); } } public static bool CheckNumber(string a) { if (string.IsNullOrWhiteSpace(a)) return false; var content = a; foreach (var item in content) { if (!"0123456789.".Contains(item)) { return false; } } return true; } public static bool EqualsZero(LongNumber a) { foreach (var item in a.Number) { if (!"0.".Contains(item)) { return false; } } return true; } } public enum NumberFlag { Negative, Zero, Positive } }
/// <summary> /// 比较两个长整数的大小 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> private int Compare(LongNumber a, LongNumber b) { //格式化数据 var inputA = a.Number; var inputB = b.Number; FormatNumber(ref inputA, ref inputB); a.Number = inputA; b.Number = inputB; var flagA = NumberFlag.Zero; var flagB = NumberFlag.Zero; if (!LongNumber.EqualsZero(a)) flagA = a.Flag; if (!LongNumber.EqualsZero(b)) flagB = b.Flag; if (flagA == NumberFlag.Zero && flagB == NumberFlag.Zero) { return 0; } if (flagA > flagB) return 1; else if (flagA < flagB) return -1; else { for (var i = 0; i < a.Number.Length; i++) { var itemA = int.Parse(a.Number[i].ToString()); var itemB = int.Parse(b.Number[i].ToString()); if (itemA == itemB) continue; if (itemA > itemB) return 1; else return -1; } return 0; } } /// <summary> /// 获取小数位数 /// </summary> /// <param name="a"></param> /// <returns></returns> private int getDecimalDigits(string a) { return a.IndexOf('.') >= 0 ? a.Length - a.IndexOf('.') - 1 : 0; }
/// <summary> /// 计算a加b的结果 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> private LongNumber Add(LongNumber a, LongNumber b) { //格式化数据 var inputA = a.Number; var inputB = b.Number; FormatNumber(ref inputA, ref inputB); a.Number = inputA; b.Number = inputB; //定义进位值 var carry = 0; var sbResult = new StringBuilder(); for (var i = a.Number.Length - 1; i >= 0; i--) { var tempA = a.Number[i]; var tempB = b.Number[i]; if (tempA == '.') { sbResult.Insert(0, tempA); continue; } var tempResult = int.Parse(tempA.ToString()) + int.Parse(tempB.ToString()) + carry; if (tempResult > 9) { carry = 1; tempResult -= 10; } else { carry = 0; } sbResult.Insert(0, tempResult.ToString()); } if (carry > 0) sbResult.Insert(0, carry); return new LongNumber(sbResult.ToString()); }
/// <summary> /// 往小数点后面的小数位末尾补0,在小数左边补零,以使两数左右对齐 /// </summary> /// <param name="a"></param> /// <param name="b"></param> private void FormatNumber(ref string a, ref string b) { //获取小数位数 var aDecimalDigits = getDecimalDigits(a); var bDecimalDigits = getDecimalDigits(b); //补齐小数位数,使其右对齐 var sb = new StringBuilder(); for (var i = 0; i < Math.Abs(aDecimalDigits - bDecimalDigits); i++) { sb.Append('0'); } if (aDecimalDigits > bDecimalDigits) { sb.Insert(0, b); b = sb.ToString(); } else if (bDecimalDigits > aDecimalDigits) { sb.Insert(0, a); a = sb.ToString(); } //补齐左边位数,使其可以左对齐 sb.Clear(); for (var i = 0; i < Math.Abs(a.Length - b.Length); i++) { sb.Append('0'); } if (a.Length > b.Length) { sb.Append(b); b = sb.ToString(); } else if (b.Length > a.Length) { sb.Append(a); a = sb.ToString(); } }
你没有注意到100亿这个数字吗?
所有的数值类型都是有最大处理能力的。
比如Long应该只能最大到2147483648。
long 是8位,64个字节,处理2的64次方
@优质代码: long 是 32 位,4 字节.即使是 long long ,它也是 64 位,8 字节,不是你说的"8 位,64个字节".不知道你是如何理解"位"和"字节"的.
看到这么大的数不可能想不到高精度。至于为什么是那样的代码,我只能告诉你这是在模拟人脑运算。请搞清楚高精度计算的含义
long装不下100亿