`

工具类收集--GreatNumber.java

    博客分类:
  • java
阅读更多
GreatNumber.java实现了两个超大数值(整数或浮点数都可以)的相加,也可以进行精度控制。
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);
    }

}

弄好了才发现sun提供类BigDecimal&BigInteger实现这个功能,哎~~~~
分享到:
评论

相关推荐

    mysql-connector-java-8.0.28.tar.gz

    Hive是建立在Hadoop之上的数据仓库工具,它允许用户使用类SQL语言(HQL,Hive Query Language)进行数据查询、分析和管理。然而,Hive本身并不支持直接连接到关系型数据库,这时就需要像MySQL Connector/J这样的驱动...

    mysql-connector-java-5.1.32.tar.gz

    "mysql-connector-java-5.1.32-bin.jar" 是该驱动包的核心组件,它是一个Java Archive (JAR) 文件,包含了所有必要的类和资源,用于建立Java应用程序与MySQL服务器之间的连接。JDBC驱动程序分为四种类型:Type 1(纯...

    mchange-commons-java-0.2.3.jar.zip

    mchange-commons-java.jar 各个版本,免费下载 mchange-commons-java.jar 是一个java 开发库, 提供许多常用的工具类和功能,包括数据库连接池、线程池、反射、集合操作等。

    mysql-connector-java-5.1.40.zip和mysql-connector-java-5.1.10.jar

    在实际开发中,你可以将`mysql-connector-java-5.1.10.jar`添加到项目的类路径(classpath)中,或者在Maven或Gradle等构建工具的依赖管理中指定对应的版本,以确保Java应用能够找到并使用这个驱动。 总结,`mysql-...

    cors-filter-1.7.jar 和 java-property-utils-1.9.jar

    而`java-property-utils-1.9.jar` 提供了一些用于处理Java属性文件的工具类,这些工具在配置CORS过滤器时可能会用到,例如读取配置文件中的CORS策略。 在配置CORS过滤器时,首先需要将这两个库添加到项目的类路径中...

    mysql-connector-java-8.0.20.jar

    使用`mysql-connector-java-8.0.20.jar`时,开发者首先需要将其添加到项目的类路径中,这可以通过Maven或Gradle等构建工具实现。接着,通过以下步骤建立数据库连接: 1. 加载驱动:`Class.forName(...

    mysql-connector-java-8.0.23.zip

    总的来说,"mysql-connector-java-8.0.23.zip"文件是Java开发者与MySQL 8.0.23数据库交互的重要工具,它简化了Java应用程序与MySQL之间的通信,让开发者能够利用强大的Java语言特性处理数据库操作。在实际项目中,...

    Selenium-Java-3.141.59 安装包

    在使用这个安装包时,你需要将其解压到你的项目中,并将Selenium的JAR文件添加到你的Java项目的类路径中。然后,你可以使用Java编写测试脚本,利用Selenium提供的各种方法来操作浏览器,如打开网页、输入文本、点击...

    eclipse-java-2023-09-R-linux-gtk-x86-64.tar.gz

    “eclipse-java”标签进一步强调了这个Eclipse版本专注于Java开发,其中包含了对Java开发所需的各种工具和特性,如Java语法高亮、代码自动完成、JVM调试器等。 在压缩包子文件的文件名称列表中提到的“eclipse”,...

    sonar-java-plugin-5.12.1.17771.rar

    总的来说,"sonar-java-plugin-5.12.1.17771.rar"是一个强大的Java代码质量检查工具,它通过FindBugs插件增强了SonarQube的分析能力,是构建高效、安全代码审查体系的重要组成部分。对于注重代码质量和安全性的公司...

    mchange-commons-java-0.2.12.jar+c3p0-0.9.5.2.jar+c3p0-config.xml

    这个库通常作为C3P0连接池的一个依赖,因为它包含了对C3P0有用的工具类和辅助功能。例如,它可能提供了数据库连接状态检查、事务管理等底层支持。MChange Commons Java库使得C3P0能更好地与数据库交互,优化性能和...

    mchange-commons-java-0.2.11.jar

    总结而言,"mchange-commons-java-0.2.11.jar"是一个强大的Java工具库,它集成了多种实用功能,旨在帮助开发者更高效地完成工作。了解并掌握这类库的使用,能够提升Java开发者的专业技能,使他们在面对复杂项目时更...

    mysql-connector-java-8.0.15.jar

    总的来说,MySQL Connector/J 8.0.15.jar 是 Java 开发人员连接到 MySQL 8.0 数据库的重要工具,它提供了全面的 JDBC 支持,让开发人员能够轻松地执行各种数据库操作,包括数据查询、插入、更新和删除。通过合理地...

    jquery插件jquery-ui-1.8.2.custom.min.js

    在1.8.2这个版本中,jQuery UI包含了多个模块,如Widgets(组件)、Effects(特效)、Position(定位)和Utilities(工具函数)。Widgets是jQuery UI的核心,包括Accordion(手风琴效果)、Autocomplete(自动补全)...

    show-busy-java-threads.sh文件

    `show-busy-java-threads.sh`脚本就是为了帮助开发者快速定位和排查这类性能问题而设计的。这个脚本主要用于监控并展示Java应用程序中的繁忙线程,从而帮助我们理解程序的执行状态,找出可能导致高CPU负载的原因。 ...

    java-1.8.0-openjdk-1.8.0.402.b06-1.el7-9.x86-64.rpm离线升级包

    Java 1.8.0 OpenJDK 1.8.0.402.b06-1.el7_9.x86_64.rpm 是一个针对Linux系统的Java开发工具包的离线升级版本。这个包特别适用于那些无法或不便在线更新Java环境的系统,比如在没有互联网连接或者网络环境受限的...

    java-WebSocket-1.3.7.jar和java-WebSocket-1.3.4.jar

    总之,Java WebSocket库为Java开发者提供了方便地实现WebSocket协议的工具,结合其源代码,开发者不仅可以创建实时Web应用,还可以深入了解WebSocket协议的实现细节。通过选择合适的版本(如1.3.7或1.3.4),开发者...

    java-unrar-0.3.jar以及commons-logging-1.1.1.jar

    在Java编程环境中,处理RAR文件通常需要特定的库支持,因为Java的标准库并不包含直接解压RAR文件的功能。这里提到的"java-unrar-0.3.jar"和"commons-logging-1.1.1.jar"是两个关键的Java库,它们提供了处理RAR文件和...

    mchange-commons-java-0.2.3.4.jar、hibernate-c3p0-4.2.4.Final.jar、c3p0-0.9.2.1.jar

    `mchange-commons-java-0.2.3.4.jar`是Mchange Commons Java库,它是C3P0的一个依赖,主要用于提供一些通用的工具类和功能。例如,它包含了一些用于处理日期和时间的工具,还有一些实用的异常处理和日志记录功能。这...

Global site tag (gtag.js) - Google Analytics