利用字符串和十进制逢10进位的特性实现大数据的算术运算。(加法案例)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了利用字符串和十进制逢10进位的特性实现大数据的算术运算。(加法案例),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3663字,纯文字阅读大概需要6分钟。
内容图文
java中普通的数据类型int,long等不支持大数据间的算术运算,会出现丢失精度的问题,甚至无法用现有数据类型表示。
例如:对这两个数做加法运算:1243543534646546546465465465464654+32423985348957348957348957348957348574=?
在java中Long类型已经无法表示了,Long类型的最大值为Long.MAX_VALUE=9223372036854775807。
但jdk类库中提供了BigInteger类型,可以解决。
这里我用字符串和十进制运算进位的特性实现下大数的加法运算,其它的运算还没来得及做。
本人的技术一般,懂得东西太少,要学的东西太多,时间实在紧迫,因此博客写的简单些,只把主要的东西将清楚,算留作自己的技术笔记!
代码:
1 /** 2 * Project Name:javaBaseReview 3 * Package Name:com.xuwei.base.algorithm 4 * author:David 5 * Date:2015年8月16日上午11:00:53 6 * Copyright (c) 2015, xw123box@126.com All Rights Reserved. 7 * 8 */ 9 package com.xuwei.base.algorithm; 10 11 /** 12 * 利用字符串和十进制进位特性实现大数据之间的算术运算 13 * @author David 14 * @since 2015年8月16日 上午11:00:53 15 * @version 16 * @since JDK 1.6 17 */ 18 public class BigInt{ 19 private String valStr; 20 private int [] val; 21 /** 22 * @param string 23 */ 24 public BigInt(String val) { 25 int[]val2=null; 26 val2=str2IntArr(val); 27this.val=val2; 28this.valStr=val; 29 } 30 31public String add(String val){ 32int[]res=null; 33 res=add(this.val, str2IntArr(val)); 34return toString(res); 35 } 36 37public String add(BigInt val){ 38int[]res=null; 39 res=add(this.val, str2IntArr(val.toString())); 40return toString(res); 41 } 42 43private String toString(int[] arr){ 44 StringBuilder sb=new StringBuilder(); 45for(int i=0;i<arr.length;i++){ 46 sb.append(arr[i]); 47 } 48return sb.toString(); 49 } 50 51 52/** 53 * 字符串数字转换int数组 54 * @param val 55 * @return 56*/ 57privateint[] str2IntArr(String val) { 58char[]ch=val.toCharArray(); 59int[]toIntArr=newint[ch.length]; 60for(int i=0;i<ch.length;i++){ 61 toIntArr[i]=Integer.parseInt(ch[i]+""); 62 } 63return toIntArr; 64 } 65 66/* 加法 */ 67publicint[] add(int[] a, int[] b) { 68/* 定义进位值,初始为0 */ 69int remainder = 0; 70/* 定义返回的数组 */ 71int[] res = null; 72int[] c=null; 73if(a.length!=b.length){ 74if(a.length<b.length){//a<b 75 res=newint[b.length]; 76 c=newint[b.length]; 77for(int i=c.length-a.length,j=0;i<c.length;i++,j++){ 78 c[i]=a[j]; 79 } 80 add(c, b, remainder, res); 81return res; 82 }else{//a>b 83 res=newint[a.length]; 84 c=newint[a.length]; 85for(int i=c.length-b.length,j=0;i<c.length;i++,j++){ 86 c[i]=b[j]; 87 } 88 add(c, a, remainder, res); 89return res; 90 } 91 92 }else{ 93 res=newint[a.length]; 94 add(a, b, remainder, res); 95return res; 96 } 97 } 98 99//对2个位数相同的数进行加法运算100privatevoid add(int[] a, int[] b, int remainder, int[] res) { 101for (int i = a.length - 1; i >= 0; i--) { 102 res[i] = a[i] + b[i] + remainder; 103if (res[i] < 10) { 104 remainder = 0; 105 } else { 106 remainder = 1; 107if(i!=0) 108 res[i] = res[i]-10; 109 } 110 } 111 } 112113 @Override 114public String toString() { 115returnthis.valStr; 116 } 117118119 }
1 /** 2 * Project Name:javaBaseReview 3 * Package Name:com.xuwei.base.algorithm 4 * author:David 5 * Date:2015年6月15日下午6:02:04 6 * Copyright (c) 2015, xw123box@126.com All Rights Reserved. 7 * 8 */ 9 package com.xuwei.base.algorithm; 10 11 import java.math.BigInteger; 12 13 /** 14 * 用字符串实现大数据之间的算术运算 15 * 16 * @author David 17 * @since 2015年6月15日 下午6:02:04 18 * @version 19 * @since JDK 1.6 20 */ 21 public class BigCalc { 22 public static void main(String[] args) { 23 Long a=Long.MAX_VALUE; 24long b=Long.MAX_VALUE; 25 System.out.println(a); 26 System.out.println(a+b); 27282930// BigInt a=new BigInt("239385234454"); 31// BigInt b=new BigInt("1223234454"); 32// System.out.println(a.add(b)); 33//34// BigInteger c=new BigInteger("239385234454"); 35// BigInteger d=new BigInteger("1223234454"); 36// System.out.println(c.add(d));3738 } 3940 }
测试结果:
测试结果表明运算结果与Jdk的BigInteger算的结果相同!
原文:http://www.cnblogs.com/davidxu/p/4733956.html
内容总结
以上是互联网集市为您收集整理的利用字符串和十进制逢10进位的特性实现大数据的算术运算。(加法案例)全部内容,希望文章能够帮你解决利用字符串和十进制逢10进位的特性实现大数据的算术运算。(加法案例)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。