GreatNumber.java实现了两个超大数值(整数或浮点数都可以)的相加,也可以进行精度控制。
弄好了才发现sun提供类BigDecimal&BigInteger实现这个功能,哎~~~~
package org.siyn.util;
/** *//**
* “超大数”实用类
* @author siyn
* @date 2008-04-27
*
*/
public class GreatNumber
{
private GreatNumber(){}
/** *//**
* 超大数字相加
*
* @param {String}greatNumber1 待加“超大数1”
* @param {String}greatNumber2 待加“超大数2”
* @param {int}precision 精度(如果为负数,不限精度)
*
* @return String 两个“超大数”之和
* @throws NumberFormatException
*/
public static String add(String greatNumber1,String greatNumber2,int precision) throws RuntimeException
{
StringBuffer result = new StringBuffer("");
//小数部分Fractional part
String greatNumber1_FraPart = "";
String greatNumber2_FraPart = "";
//整数部分Integral part
String greatNumber1_IntPart = "";
String greatNumber2_IntPart = "";
//小数点位置
int locationOfDot = 0;
//整数的小数部分补充0
String zero = "";
for(int i=0;i<precision ;i++)
{
zero +="0";
}
//划分整数部分和小数部分
if(greatNumber1.indexOf('.')==-1)
{
greatNumber1_FraPart = zero;
greatNumber1_IntPart = greatNumber1;
}
else
{
locationOfDot = greatNumber1.indexOf('.');
greatNumber1_FraPart = greatNumber1.substring(locationOfDot+1);
greatNumber1_IntPart = greatNumber1.substring(0,locationOfDot);
}
//System.out.println("greatNumber1="+greatNumber1_IntPart+"."+greatNumber1_FraPart);
if(greatNumber2.indexOf('.')==-1)
{
greatNumber2_FraPart = zero;
greatNumber2_IntPart = greatNumber2;
}
else
{
locationOfDot = greatNumber2.indexOf('.');
greatNumber2_FraPart = greatNumber2.substring(locationOfDot+1);
greatNumber2_IntPart = greatNumber2.substring(0,locationOfDot);
}
//System.out.println("greatNumber2="+greatNumber2_IntPart+"."+greatNumber2_FraPart);
//小数部分
StringBuffer result_FraPart = new StringBuffer();
int carry = 0;
int g1_FraPart_len = greatNumber1_FraPart.length();
int g2_FraPart_len = greatNumber2_FraPart.length();
int len = g1_FraPart_len>g2_FraPart_len?g1_FraPart_len:g2_FraPart_len;
//精度控制
if(precision<0)precision = len;
len = len<precision?precision:len;//取大
//String up_FraPart = g1_FraPart_len>g2_FraPart_len?greatNumber1_FraPart:greatNumber2_FraPart;
//if(precision<up_FraPart.length()) carry = up_FraPart.charAt(precision)-48>4?1:0;
for(int i=len-1;i>=0;i--)
{
char c1 = g1_FraPart_len > i?greatNumber1_FraPart.charAt(i):'0';
char c2 = g2_FraPart_len > i?greatNumber2_FraPart.charAt(i):'0';
if(Character.isDigit(c1) && Character.isDigit(c2))
{
int c = ( (c1-48)+(c2-48)+carry )%10;
//进位
if(i==precision)
{
carry = ( (c1-48)+(c2-48)+carry )/5;
carry = carry>0?1:0;
}
else
{
carry = ( (c1-48)+(c2-48)+carry )/10;
}
//精度控制
if(i<precision) result_FraPart.insert(0, c);
}
else
{
throw new NumberFormatException("输入参数存在非数字字符.");
}
}
//整数部分
StringBuffer result_IntPart = new StringBuffer("");
int g1_IntPart_len = greatNumber1_IntPart.length();
int g2_IntPart_len = greatNumber2_IntPart.length();
len = g1_IntPart_len>g2_IntPart_len?g1_IntPart_len:g2_IntPart_len;
for(int i=0;i<len;i++)
{
char c1 = g1_IntPart_len > i?greatNumber1_IntPart.charAt(g1_IntPart_len-1-i):'0';
char c2 = g2_IntPart_len > i?greatNumber2_IntPart.charAt(g2_IntPart_len-1-i):'0';
if(Character.isDigit(c1) && Character.isDigit(c2))
{
int c = ( (c1-48)+(c2-48)+carry )%10;
carry = ( (c1-48)+(c2-48)+carry )/10;
result_IntPart.insert(0, c);
}
else
{
throw new NumberFormatException("输入参数存在非数字字符.");
}
}
if(carry!=0) result_IntPart.insert(0, carry);//最后一个进位
result.append(result_IntPart);
result.append(".");
result.append(result_FraPart);
return result.toString();
}
/** *//**
* 超大数字相加(不限精度)
*
* @param {String}greatNumber1 待加超大数1
* @param {String}greatNumber2 待加超大数1
*
* @return String 两个超大数之和
* @throws NumberFormatException
*/
public static String add(String greatNumber1,String greatNumber2) throws RuntimeException
{
return GreatNumber.add(greatNumber1, greatNumber2, -1);
}
public static void main(String[] aa)
{
String greatNumber1 = "9999999999999999999999999999999999999983.123456789";
String greatNumber2 = "17.2";
String result = GreatNumber.add(greatNumber1, greatNumber2,-6);
System.out.println(" " + greatNumber1);
System.out.println(" + " + greatNumber2);
System.out.println("----------------------------------------------------------");
System.out.println(" = " + result);
}
}
/** *//**
* “超大数”实用类
* @author siyn
* @date 2008-04-27
*
*/
public class GreatNumber
{
private GreatNumber(){}
/** *//**
* 超大数字相加
*
* @param {String}greatNumber1 待加“超大数1”
* @param {String}greatNumber2 待加“超大数2”
* @param {int}precision 精度(如果为负数,不限精度)
*
* @return String 两个“超大数”之和
* @throws NumberFormatException
*/
public static String add(String greatNumber1,String greatNumber2,int precision) throws RuntimeException
{
StringBuffer result = new StringBuffer("");
//小数部分Fractional part
String greatNumber1_FraPart = "";
String greatNumber2_FraPart = "";
//整数部分Integral part
String greatNumber1_IntPart = "";
String greatNumber2_IntPart = "";
//小数点位置
int locationOfDot = 0;
//整数的小数部分补充0
String zero = "";
for(int i=0;i<precision ;i++)
{
zero +="0";
}
//划分整数部分和小数部分
if(greatNumber1.indexOf('.')==-1)
{
greatNumber1_FraPart = zero;
greatNumber1_IntPart = greatNumber1;
}
else
{
locationOfDot = greatNumber1.indexOf('.');
greatNumber1_FraPart = greatNumber1.substring(locationOfDot+1);
greatNumber1_IntPart = greatNumber1.substring(0,locationOfDot);
}
//System.out.println("greatNumber1="+greatNumber1_IntPart+"."+greatNumber1_FraPart);
if(greatNumber2.indexOf('.')==-1)
{
greatNumber2_FraPart = zero;
greatNumber2_IntPart = greatNumber2;
}
else
{
locationOfDot = greatNumber2.indexOf('.');
greatNumber2_FraPart = greatNumber2.substring(locationOfDot+1);
greatNumber2_IntPart = greatNumber2.substring(0,locationOfDot);
}
//System.out.println("greatNumber2="+greatNumber2_IntPart+"."+greatNumber2_FraPart);
//小数部分
StringBuffer result_FraPart = new StringBuffer();
int carry = 0;
int g1_FraPart_len = greatNumber1_FraPart.length();
int g2_FraPart_len = greatNumber2_FraPart.length();
int len = g1_FraPart_len>g2_FraPart_len?g1_FraPart_len:g2_FraPart_len;
//精度控制
if(precision<0)precision = len;
len = len<precision?precision:len;//取大
//String up_FraPart = g1_FraPart_len>g2_FraPart_len?greatNumber1_FraPart:greatNumber2_FraPart;
//if(precision<up_FraPart.length()) carry = up_FraPart.charAt(precision)-48>4?1:0;
for(int i=len-1;i>=0;i--)
{
char c1 = g1_FraPart_len > i?greatNumber1_FraPart.charAt(i):'0';
char c2 = g2_FraPart_len > i?greatNumber2_FraPart.charAt(i):'0';
if(Character.isDigit(c1) && Character.isDigit(c2))
{
int c = ( (c1-48)+(c2-48)+carry )%10;
//进位
if(i==precision)
{
carry = ( (c1-48)+(c2-48)+carry )/5;
carry = carry>0?1:0;
}
else
{
carry = ( (c1-48)+(c2-48)+carry )/10;
}
//精度控制
if(i<precision) result_FraPart.insert(0, c);
}
else
{
throw new NumberFormatException("输入参数存在非数字字符.");
}
}
//整数部分
StringBuffer result_IntPart = new StringBuffer("");
int g1_IntPart_len = greatNumber1_IntPart.length();
int g2_IntPart_len = greatNumber2_IntPart.length();
len = g1_IntPart_len>g2_IntPart_len?g1_IntPart_len:g2_IntPart_len;
for(int i=0;i<len;i++)
{
char c1 = g1_IntPart_len > i?greatNumber1_IntPart.charAt(g1_IntPart_len-1-i):'0';
char c2 = g2_IntPart_len > i?greatNumber2_IntPart.charAt(g2_IntPart_len-1-i):'0';
if(Character.isDigit(c1) && Character.isDigit(c2))
{
int c = ( (c1-48)+(c2-48)+carry )%10;
carry = ( (c1-48)+(c2-48)+carry )/10;
result_IntPart.insert(0, c);
}
else
{
throw new NumberFormatException("输入参数存在非数字字符.");
}
}
if(carry!=0) result_IntPart.insert(0, carry);//最后一个进位
result.append(result_IntPart);
result.append(".");
result.append(result_FraPart);
return result.toString();
}
/** *//**
* 超大数字相加(不限精度)
*
* @param {String}greatNumber1 待加超大数1
* @param {String}greatNumber2 待加超大数1
*
* @return String 两个超大数之和
* @throws NumberFormatException
*/
public static String add(String greatNumber1,String greatNumber2) throws RuntimeException
{
return GreatNumber.add(greatNumber1, greatNumber2, -1);
}
public static void main(String[] aa)
{
String greatNumber1 = "9999999999999999999999999999999999999983.123456789";
String greatNumber2 = "17.2";
String result = GreatNumber.add(greatNumber1, greatNumber2,-6);
System.out.println(" " + greatNumber1);
System.out.println(" + " + greatNumber2);
System.out.println("----------------------------------------------------------");
System.out.println(" = " + result);
}
}
弄好了才发现sun提供类BigDecimal&BigInteger实现这个功能,哎~~~~
发表评论
-
java数据类型
2007-10-17 14:20 722java数据类型 字节 表示范围 byte(字节型 ... -
利用ServletContextListener实现定时任务
2008-01-08 10:28 890一个实现ServletContextListener接口的类: ... -
JAVA通过接口来实现CALLBACK
2008-02-17 12:25 920在网上看了好多关于java回调的文章,自己总结了一下(个人意见 ... -
利用Tomcat建立多个Web Server的方法
2008-04-02 10:41 1937**以下内容为网上收集 ... -
使用javap反编译class文件
2008-05-07 10:09 749一个普通的Java类: public class Test ... -
自己整理的分页工具
2008-07-10 13:21 818今天自己整理了一个分页工具(刚做还有很多没完善的地方),把它放 ... -
工具类收集--PropertiesReader.java
2008-07-12 16:54 2104PropertiesReader.java 一个 ... -
Thinking in Java 摘要
2008-07-21 09:53 560同人类任何语言一样,Java为我们提供了一种表达思想的方式。如 ... -
native2ascii.bat
2008-09-05 15:08 907native2ascii_bat.bat del packa ... -
[转]Java IO 包中的Decorator模式
2009-02-20 10:20 732来源:http://www.cn-java.com ...
相关推荐
“eclipse-java”标签进一步强调了这个Eclipse版本专注于Java开发,其中包含了对Java开发所需的各种工具和特性,如Java语法高亮、代码自动完成、JVM调试器等。 在压缩包子文件的文件名称列表中提到的“eclipse”,...
使用`mysql-connector-java-8.0.20.jar`时,开发者首先需要将其添加到项目的类路径中,这可以通过Maven或Gradle等构建工具实现。接着,通过以下步骤建立数据库连接: 1. 加载驱动:`Class.forName(...
在使用"mysql-connector-java-5.1.49.jar"时,开发者通常需要将其添加到项目的类路径中,以便Java虚拟机在运行时能找到并加载这个驱动。在现代的构建工具如Maven或Gradle中,这可以通过依赖管理来实现。在没有构建...
1. **引入依赖**:将`mysql-connector-java-5.1.40.jar`添加到项目的类路径中,这可以通过Maven或Gradle等构建工具完成。 2. **建立连接**:通过`java.sql.DriverManager`类的`getConnection()`方法,传入MySQL...
5. `esdk-obs-java-3.20.3-javadoc.jar`:这是Java文档的归档文件,提供了详细的API文档,便于开发者了解每个类和方法的具体功能和用法。 6. `doc`:可能包含更详细的SDK文档,帮助开发者深入理解OBS SDK的内部工作...
总的来说,这两个Java库文件是Java开发中的重要组件,它们帮助开发者处理跨域问题以及提供实用的工具类。了解并熟练运用这些库,可以显著提升Java应用的效率和质量。在实际项目中,开发者通常会将这些库通过Maven或...
总的来说,`mysql-connector-java-5.1.46.jar` 和 `mysql-connector-java-5.1.46-bin.jar` 提供了Java开发者与MySQL数据库交互的必要工具,选择哪个取决于具体的应用需求和环境。正确配置和使用这些驱动是确保Java...
5. **Java打包工具(jar)**: 用于创建和管理Java归档(JAR)文件,这些文件可以包含多个类和资源文件。 6. **Java调试器(jdb)**: 用于调试Java程序,帮助开发者查找和修复错误。 7. **Java性能分析工具...
Java 1.8.0 OpenJDK 是一个广泛使用的开源Java开发工具包,适用于Linux x86_64架构的系统。OpenJDK是Java Development Kit(JDK)的一个实现,由Oracle公司发起并维护,它遵循GNU General Public License (GPL)条款...
综上,mysql-connector-java-8.0.23.jar是Java开发者连接MySQL数据库的重要工具,提供高效、安全的数据访问接口。正确地集成和使用此驱动,可以极大地简化Java应用与MySQL数据库的交互,提高开发效率和应用性能。
1. 添加依赖:将`mysql-connector-java-5.1.44-bin.jar`添加到项目的类路径中,无论是IDE如Eclipse或IntelliJ IDEA的构建路径,还是构建工具如Maven或Gradle的依赖管理。 2. 建立连接:使用`java.sql.DriverManager`...
总结而言,"mchange-commons-java-0.2.11.jar"是一个强大的Java工具库,它集成了多种实用功能,旨在帮助开发者更高效地完成工作。了解并掌握这类库的使用,能够提升Java开发者的专业技能,使他们在面对复杂项目时更...
总之,"java-unrar-0.3.jar"和"commons-logging-1.1.1.jar"为Java开发者提供了处理RAR文件的强大工具,使得在Java环境中解压RAR文件变得简单易行,同时通过Commons Logging提供了灵活的日志记录机制。在项目中正确...
在Java编程环境中,处理RAR文件通常需要特定的库支持,因为Java的标准库并不包含直接解压RAR文件的功能。这里提到的"java-unrar-0.3.jar"和"commons-logging-1.1.1.jar"是两个关键的Java库,它们提供了处理RAR文件和...
Java 1.8.0 OpenJDK 是一个广泛使用的开源Java开发工具包,适用于各种操作系统,包括Windows。这个版本的OpenJDK是1.8.0.282的更新,基于1.b08.dev.redhat分支,专为64位(x86_64)Windows平台设计。OpenJDK是Java ...
JDBC是Java标准的一部分,它提供了一组接口和类,用于创建、执行SQL语句并管理数据库连接。 5.1.10是这个驱动的版本号,表示这是在2010年左右发布的一个稳定版本。每个版本的更新通常会修复已知问题,提高性能,...
`bin.jar`通常意味着这是一个可执行的Java类库,包含了一系列编译后的Java类,供Java应用程序在运行时加载和使用。在这个特定的上下文中,它包含了所有必要的类和资源,用于建立和管理Java应用程序与MySQL数据库的...
在Java开发中,`mysql-connector-java-8.0.13.jar`是MySQL 8.0.13版本的JDBC驱动包,这个驱动包包含了所有必要的类和接口,用于在Java程序中建立、管理和操作MySQL数据库的连接。当你下载并解压此压缩包后,你会得到...
在没有使用Maven或其他构建工具的情况下,将`mysql-connector-java-5.1.48.jar`存放在一个专门的文件夹中,并在运行Java应用程序时确保该文件夹被包含在类路径中,是一种常见的做法。这有助于保持项目结构清晰,同时...
Java开发工具包(Java Development Kit,简称JDK)是Java编程语言的重要组成部分,用于开发和运行Java应用程序。在这个场景中,我们关注的是OpenJDK的1.8.0版本,它是一个开源实现的Java SE(标准版)平台。OpenJDK...