- 浏览: 132163 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
memoryisking:
可以看看这篇文章,构建一个简单的线程池,这个是struts教程 ...
java 线程池示例(自己实现的参考别人的代码) -
zwq194:
坑爹啊,误导人,代码有问题
java 线程池示例(自己实现的参考别人的代码) -
zhouming4455:
貌似你传错了哦
java 线程池示例(自己实现的参考别人的代码)
1.1. 关于引用
Java 语言首先便假定了我们只希望进行面向对象的程序设计,也就是说用它正式写程序之前首先必须先将自己的思想转入一个纯净的面向对象的世界,Java 中的一切都是对象即便一个Java 程序它本身也是一个对象。
任何东西都可看作一个对象, 但要注意尽管将一切都看作对象,但操作的标识符实际是对一个对象的引用(Reference)。只是由于拥有一个引用并不表示必须有一个对象同它连接,所以如果想容纳一个词或句子可创建一个String 引用:
String s;
但这里创建的只是引用并不是对象,若此时向s 发送一条消息,就会获得一个运行时错误,这是由于s 实际并未与任何东西连接;因此一种更安全的做法是创建一个引用时记住,无论如何都进行初始化:
String s = "asdf";
创建一个引用时我们希望它同一个新对象建立连接,通常用new 关键字达到这一目的。new 的意思是把我变成这种类型的一个对象,所以上面的例子也可以表达成:
String s = new String("asdf");
1.2. Java类型
在java语言中有这样几个概念:类(即我们自行创建的类型),基本类型(系统原有包含的),对象,引用;
我们在java中用class标识的就是所谓的类,由类生产对象,对象隶属于类;对象由其类规定好的功能和成员;而基本类型,是靠程序来声明及初始化的,它没有方法;基本类型都对应有相应的封装器,封装器里有着相应的方法,从而实现基本类型到类对象的转化;
对于对象而言,通过引用操作对象,引用并非对象本身;对于基本类型来说,引用既是类型数值本身;
1.2.1. 基本类型
在java中有一系列类型要求我们特殊对待,可将它们想象成基本主要或者主Primitive类型,进行程序设计时会频繁用到它们;之所以要特别对待,是由于用new 创建某些对象时,特别是那些小的简单的变量,效率并不是特别高,因为new 会把对象放到堆里;对于这些类型,Java 提供了和C和C++类似的做法,也就是说不要用new创建这些变量,而是创建一个自动变量,这种变量并非一个引用,为什么不是引用呢?因为其中容纳了具体的值,并放在堆栈,而不是内存堆中,从而获得更高的效率;
Java 事先决定好了每种主类型的大小,就象在大多数语言中那样;这种大小并不随着你改换硬件平台操作系统而变化,而大小不可更改正是Java程序具有很强移植能力的原因之一;
Java的数据类型分为三大类,即布尔型、字符型和数值型,而其中数值型又分为整型和浮点型;相对于数据类型,Java的变量类型为布尔型boolean;字符型char;整型byte、short、int、long;浮点型float、double。其中四种整型变量和两种浮点型变量分别对应于不同的精度和范围。
主类型 大小 最小值 最大值 封装器类型
boolean - - - Boolean
Char 16-bit Unicode 0 Unicode 216- 1 Character
byte 8-bit -128 +127 Byte
Short 16-bit -215 +215?1 Short
Int 32-bit -231 +231?1 Integer
Long 64-bit -263 +263?1 Long
Float 32-bit IEEE754 IEEE754 Float
double 64-bit IEEE754 IEEE754 Double
Void - - - Void
注意:
1、 所有数值类型都是有符号正负号的;
2、 boolean 布尔类型的大小没有明确规定,只要能容下true 或false 这两个文字值就OK 了;
原始数据类型也拥有自己的封装器wrapper类,这意味着假如想让堆内一个非主对象表示那个主类型,就要使用对应的封装器;例如:
char c = 'x';
Character C = new Character(c);
也可直接使用:
Character C = new Character('x');
1.2.2. Java的包装类
所谓包装类,就是可以直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。
Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就可以看出它们分别对应于 boolean、char、int、long、float和double。而String本身就是类。所以也就不存在什么包装类的概念了。
1.2.3. 基本类型、封装器及其互换
1.2.3.1. 整型、实型、字符型变量中的相互转换
在Java中整型、实型、字符型被视为同一类数据,这些类型由低级到高级分别为(byte,short,char)??int??long??float??double,低级变量可以直接转换为高级变量,例如,下面的语句可以在Java中直接通过:
byte b;
int i=b;
而将高级变量转换为低级变量时,情况会复杂一些,你可以使用强制类型转换。即你必须采用下面这种语句格式:
int i;
byte b=(byte)i;
可以想象,这种转换肯定可能会导致溢出或精度的下降,因此我们并不推荐使用这种转换。
浮点数的赋值是带有小数点的数字缺省是double型的,如果在浮点数后面加f或者F则是float,后面加d或者D则是double,科学计数法形式的浮点数也是double型的,而double的精度比float高,将一个高精度的double赋值给一个低精度的float时需要进行强制类型转换,反之则不需要。
float f = 11.1;(是错误的)
1.2.3.2. 简单类型变量和包装类之间的相互转换
简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。即:
Boolean(boolean value);
Character(char value);
Integer(int value);
Long(long value);
Float(float value);
Double(double value)
而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
1.2.3.3. String类和其它数据类型的相互转换
对于上面的这些包装类,除了Character以外,都有可以直接使用字符串参数的构造函数,这也就使得我们将String类转换为这些数据类型变得相当之简单,即:
Boolean(String s);
Integer(String s);
Long(String s);
Float(String s);
Double(String s);
现在我们还剩下一个字符型变量,事实上String类可以理解为一个char型数组,因此我们可以在String类中找到这样的方法来实现这种转换:charAt(int index)可以得到String类中某一位置上的字符,toCharArray()更可以将整个String类转换成一个char的数组。
对于所有的包装类都存在一个名为toString()的方法可以将其转换成对应的String类,而对于整型类和长整型类,还可以使用toBinaryString(int i)、toHexString(int i)、toOctalString(int i)分别以二进制、十六进制和八进制的形式进行到String类的转换。
1.2.3.4. 字符型直接做为数值转换为其它数据类型
将字符型变量转换为数值型变量实际上有两种对应关系,在我们在第一部分所说的那种转换中,实际上是将其转换成对应的ASCII码,但是我们有时还需要另一种转换关系,例如,‘1’就是指的数值1,而不是其ASCII码,对于这种转换,我们可以使用Character的 getNumericValue(char ch)方法。
package com.minght.sys.util;
public class ObjConvert {
private ObjConvert() {
}
/*********************基本类型与包装器的相互转化****************/
/**
* 将Integer包装器转化成int基本类型
* @param I Integer
* @return int
*/
public static int integerToInt(Integer I){
if(I==null)
return 0;
int i = I.intValue();
return i;
}
/**
* 将int基本类型转化成Integer包装器对象
* @param i int
* @return Integer
*/
public static Integer intToInteger(int i){
Integer I = new Integer(i);
return I;
}
/**
* 将Charater 包装器对象转化成char基本类型
* @param C Character
* @return char
*/
public static char charaterToChar(java.lang.Character C){
if(C==null)
return '0';
char c = C.charValue();
return c;
}
/**
* 将char基本类型转化成Charater 包装器对象
* @param c char
* @return Character
*/
public static Character charToCharater(char c){
Character C = new Character('c');
return C;
}
/**
* 将Long 包装器对象转化成long基本类型
* @param L Long
* @return long
*/
public static long LongTolong(Long L){
if(L==null){
return 0l;
}
long l = L.longValue();
return l;
}
/**
* 将long基本类型转化为Long包装器对象
* @param l long
* @return Long
*/
public static Long longToLong(long l){
Long L = new Long(l);
return L;
}
/**
* 将Float包装器对象转化为float基本类型
* @param F Float
* @return float
*/
public static float FloatTofloat(Float F){
if(F==null){
return -1f;
}
float f = F.floatValue();
return f;
}
/**
* 将float基本类型转化为Float包装器对象
* @param f float
* @return Float
*/
public static Float floatToFloat(float f){
Float F = new Float(f);
return F;
}
/**
* 将Double包装器对象转化为double基本类型
* @param D Double
* @return double
*/
public static double DoubleTodouble(Double D){
if(D==null)
return 0D;
double d = D.doubleValue();
return d;
}
/**
* 将double基本类型转化为Double包装器对象
* @param d double
* @return Double
*/
public static Double doubleToDouble(double d){
Double D = new Double(d);
return D;
}
/**
* 将Boolean包装器对象转化为boolean基本类型
* @param B Boolean
* @return boolean
*/
public static boolean BooleanToboolean(Boolean B){
if(B==null)
return false;
boolean b = B.booleanValue();
return b;
}
/**
* 将boolean基本类型转化为Boolean对象类型
* @param b boolean
* @return Boolean
*/
public static Boolean booleanToBoolean(boolean b){
Boolean B = new Boolean(b);
return B;
}
/***************************各类型与string类型的相互转换***********************/
/**
* 将String对象转化为int基本类型
* @param s String
* @return int
*/
public static int sToi(String s){
int i = -1;
if(s==null || s.trim().length()==0){
return i;
}
try{
i = Integer.parseInt(s);
}catch(Exception e){
Debug.print("Stirng convet to int error ! ");
return i;
}
return i;
}
/**
* 将int类型转化为String
* @param i int
* @return String
*/
public static String iTos(int i){
String s = intToInteger(i).toString();
return s;
}
/**
* 将string类型转化为long类型
* @param s String
* @return long
*/
public static long sTol(String s ){
long l = -1L;
if(s==null || s.trim().length()==0){
return l;
}
try{
l = Long.parseLong(s);
}catch(Exception e){
Debug.println("String convert to long error!");
return l;
}
return l;
}
/**
* 将long类型转化为String类型
* @param l long
* @return String
*/
public static String lTos(long l){
String s = longToLong(l).toString();
return s;
}
/**
* 将string类型转化为float类型
* @param s String
* @return float
*/
public static float sTof(String s){
float f = -1f;
if(s==null || s.length()==0){
return f;
}
try{
f = Float.parseFloat(s);
}catch(Exception e){
Debug.println("String convert to float error");
return f;
}
return f;
}
/**
* 将float类型转化为String类型
* @param f float
* @return String
*/
public static String fTos(float f){
String s = floatToFloat(f).toString();
return s;
}
/**
* 将string类型转化为double类型
* @param s String
* @return double
*/
public static double sTod(String s){
double d = -1d;
if(s==null || s.length()==0){
return d;
}
try{
d = Double.parseDouble(s);
}catch(Exception e){
Debug.println("String convert to double error");
return d;
}
return d;
}
/**
* 将double类型转化为String类型
* @param d double
* @return String
*/
public static String dTos(double d){
String s = doubleToDouble(d).toString();
return s;
}
/**
* 测试
* @param args String[]
*/
public static void main(String[] args){
Integer I = new Integer(10);
int i = integerToInt(I);
System.out.println("convert Integer to int :"+i);
}
}
1.2.4. 高精度数字
Java 提供了两个类专门用于进行高精度运算BigInteger 和BigDecimal ,尽管它们可大致划分到与封装器相同的类别里,但两者都没有对应的主类型;这两个类都有自己的一系列方法,类似于我们针对主类型执行的操作,也就是说能用int 或float 做的事情,用BigInteger和BigDecimal 一样可以做,只是必须换用方法调用,而不是使用运算符。此外由于牵涉更多,所以运算速度会慢一点总之我们牺牲了速度,但换来了精度。
1.2.4.1. 高精度整数BigInteger
BigInteger支持任意精度的整数,也就是说我们可精确表示任意大小的整数值;同时在运算过程中不会丢失任何信息;
在BigInteger类中有所有的基本算术运算方法,如加、减、乘、除,以及可能会用到的位运算如或、异或、非、左移、右移等。下面是一些方法的例子:当然,如果要有更多的使用方法,可以查阅java api 。
package com.minght.test;
import java.math.*;
/**
*
* <p>Title: 开源,开放</p>
* <p>Description: opeansource</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: ?海棠</p>
* @author HaiTang Ming
* @version 1.0
*/
public class BigIntegerTest {
public BigIntegerTest() {
}
/**
* 测试BigInteger
*/
public static void testBigInteger() {
BigInteger bi = new BigInteger("888");
//multiply :乘法
BigInteger result = bi.multiply(new BigInteger("2"));
System.out.println(result);
//divide : 除法
result = bi.divide(new BigInteger("2"));
System.out.println(result);
//add : 加法
result = bi.add(new BigInteger("232"));
System.out.println(result);
//subtract :减法
result = bi.subtract(new BigInteger("23122"));
System.out.println(result);
result = bi.shiftRight(2);
System.out.println(result);
}
public static void main(String[] args) {
testBigInteger();
}
}
1.2.4.2. 高精度浮点数BigDecimal
一些非整数值(如几美元和几美分这样的小数)需要很精确。浮点数不是精确值,所以使用它们会导致舍入误差。因此,使用浮点数来试图表示象货币量这样的精确数量不是一个好的想法。使用浮点数来进行美元和美分计算会得到灾难性的后果。浮点数最好用来表示象测量值这类数值,这类值从一开始就不怎么精确。
从 JDK 1.3 起,Java 开发人员就有了另一种数值表示法来表示非整数:BigDecimal。BigDecimal 是标准的类,在编译器中不需要特殊支持,它可以表示任意精度的小数,并对它们进行计算。在内部,可以用任意精度任何范围的值和一个换算因子来表示 BigDecimal,换算因子表示左移小数点多少位,从而得到所期望范围内的值。因此,用 BigDecimal 表示的数的形式为 unscaledValue*10-scale。
用于加、减、乘和除的方法给 BigDecimal 值提供了算术运算。由于 BigDecimal 对象是不可变的,这些方法中的每一个都会产生新的 BigDecimal 对象。因此,因为创建对象的开销,BigDecimal 不适合于大量的数学计算,但设计它的目的是用来精确地表示小数。如果您正在寻找一种能精确表示如货币量这样的数值,则 BigDecimal 可以很好地胜任该任务。
如浮点类型一样,BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals() 方法来检测数值之间是否相等时要小心。equals() 方法认为,两个表示同一个数但换算值不同(例如,100.00 和 100.000)的 BigDecimal 值是不相等的。然而,compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals()。
另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1 除以 9 会产生无限循环的小数 .111111...。出于这个原因,在进行除法运算时,BigDecimal 可以让您显式地控制舍入。movePointLeft() 方法支持 10 的幂次方的精确除法。
对于 BigDecimal,有几个可用的构造函数。其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用 BigDecimal(double) 构造函数,因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。
如果使用 BigDecimal(double) 构造函数不恰当,在传递给 JDBC setBigDecimal() 方法时,会造成似乎很奇怪的 JDBC 驱动程序中的异常。例如,考虑以下 JDBC 代码,该代码希望将数字 0.01 存储到小数字段:
PreparedStatement ps =
connection.prepareStatement("INSERT INTO Foo SET name=?, value=?");
ps.setString(1, "penny");
ps.setBigDecimal(2, new BigDecimal(0.01));
ps.executeUpdate();
在执行这段似乎无害的代码时会抛出一些令人迷惑不解的异常(这取决于具体的 JDBC 驱动程序),因为 0.01 的双精度近似值会导致大的换算值,这可能会使 JDBC 驱动程序或数据库感到迷惑。JDBC 驱动程序会产生异常,但可能不会说明代码实际上错在哪里,除非意识到二进制浮点数的局限性。相反,使用 BigDecimal("0.01") 或 BigDecimal(1, 2) 构造 BigDecimal 来避免这类问题,因为这两种方法都可以精确地表示小数。
package com.minght.sys.util;
import java.math.BigDecimal;
/**
*
* <p>Title: 开源,开放</p>
* <p>Description: opeansource</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: ?海棠</p>
* @author HaiTang Ming
* @version 1.0
*/
public class BigDecimalUtil {
//默认除法运算精度,及即保留小数点多少位
private static final int DEF_DIV_SCALE = 2;
//这个类不能实例化
private BigDecimalUtil (){
}
/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.add(b2)).doubleValue();
}
/**
* 提供精确的减法运算。
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.subtract(b2)).doubleValue();
}
/**
* 提供精确的乘法运算。
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.multiply(b2)).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后多少位,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1,double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP)).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return (b.divide(one,scale,BigDecimal.ROUND_HALF_UP)).doubleValue();
}
public static void main(String[] args){
double a = 123.345678;
double d = round(a,2);
Debug.println("round("+a+",2)--->"+d);
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/akglk/archive/2006/06/25/833131.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/akglk/archive/2006/06/25/833131.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/akglk/archive/2006/06/25/833131.aspx
Java 语言首先便假定了我们只希望进行面向对象的程序设计,也就是说用它正式写程序之前首先必须先将自己的思想转入一个纯净的面向对象的世界,Java 中的一切都是对象即便一个Java 程序它本身也是一个对象。
任何东西都可看作一个对象, 但要注意尽管将一切都看作对象,但操作的标识符实际是对一个对象的引用(Reference)。只是由于拥有一个引用并不表示必须有一个对象同它连接,所以如果想容纳一个词或句子可创建一个String 引用:
String s;
但这里创建的只是引用并不是对象,若此时向s 发送一条消息,就会获得一个运行时错误,这是由于s 实际并未与任何东西连接;因此一种更安全的做法是创建一个引用时记住,无论如何都进行初始化:
String s = "asdf";
创建一个引用时我们希望它同一个新对象建立连接,通常用new 关键字达到这一目的。new 的意思是把我变成这种类型的一个对象,所以上面的例子也可以表达成:
String s = new String("asdf");
1.2. Java类型
在java语言中有这样几个概念:类(即我们自行创建的类型),基本类型(系统原有包含的),对象,引用;
我们在java中用class标识的就是所谓的类,由类生产对象,对象隶属于类;对象由其类规定好的功能和成员;而基本类型,是靠程序来声明及初始化的,它没有方法;基本类型都对应有相应的封装器,封装器里有着相应的方法,从而实现基本类型到类对象的转化;
对于对象而言,通过引用操作对象,引用并非对象本身;对于基本类型来说,引用既是类型数值本身;
1.2.1. 基本类型
在java中有一系列类型要求我们特殊对待,可将它们想象成基本主要或者主Primitive类型,进行程序设计时会频繁用到它们;之所以要特别对待,是由于用new 创建某些对象时,特别是那些小的简单的变量,效率并不是特别高,因为new 会把对象放到堆里;对于这些类型,Java 提供了和C和C++类似的做法,也就是说不要用new创建这些变量,而是创建一个自动变量,这种变量并非一个引用,为什么不是引用呢?因为其中容纳了具体的值,并放在堆栈,而不是内存堆中,从而获得更高的效率;
Java 事先决定好了每种主类型的大小,就象在大多数语言中那样;这种大小并不随着你改换硬件平台操作系统而变化,而大小不可更改正是Java程序具有很强移植能力的原因之一;
Java的数据类型分为三大类,即布尔型、字符型和数值型,而其中数值型又分为整型和浮点型;相对于数据类型,Java的变量类型为布尔型boolean;字符型char;整型byte、short、int、long;浮点型float、double。其中四种整型变量和两种浮点型变量分别对应于不同的精度和范围。
主类型 大小 最小值 最大值 封装器类型
boolean - - - Boolean
Char 16-bit Unicode 0 Unicode 216- 1 Character
byte 8-bit -128 +127 Byte
Short 16-bit -215 +215?1 Short
Int 32-bit -231 +231?1 Integer
Long 64-bit -263 +263?1 Long
Float 32-bit IEEE754 IEEE754 Float
double 64-bit IEEE754 IEEE754 Double
Void - - - Void
注意:
1、 所有数值类型都是有符号正负号的;
2、 boolean 布尔类型的大小没有明确规定,只要能容下true 或false 这两个文字值就OK 了;
原始数据类型也拥有自己的封装器wrapper类,这意味着假如想让堆内一个非主对象表示那个主类型,就要使用对应的封装器;例如:
char c = 'x';
Character C = new Character(c);
也可直接使用:
Character C = new Character('x');
1.2.2. Java的包装类
所谓包装类,就是可以直接将简单类型的变量表示为一个类,在执行变量类型的相互转换时,我们会大量使用这些包装类。
Java共有六个包装类,分别是Boolean、Character、Integer、Long、Float和Double,从字面上我们就可以看出它们分别对应于 boolean、char、int、long、float和double。而String本身就是类。所以也就不存在什么包装类的概念了。
1.2.3. 基本类型、封装器及其互换
1.2.3.1. 整型、实型、字符型变量中的相互转换
在Java中整型、实型、字符型被视为同一类数据,这些类型由低级到高级分别为(byte,short,char)??int??long??float??double,低级变量可以直接转换为高级变量,例如,下面的语句可以在Java中直接通过:
byte b;
int i=b;
而将高级变量转换为低级变量时,情况会复杂一些,你可以使用强制类型转换。即你必须采用下面这种语句格式:
int i;
byte b=(byte)i;
可以想象,这种转换肯定可能会导致溢出或精度的下降,因此我们并不推荐使用这种转换。
浮点数的赋值是带有小数点的数字缺省是double型的,如果在浮点数后面加f或者F则是float,后面加d或者D则是double,科学计数法形式的浮点数也是double型的,而double的精度比float高,将一个高精度的double赋值给一个低精度的float时需要进行强制类型转换,反之则不需要。
float f = 11.1;(是错误的)
1.2.3.2. 简单类型变量和包装类之间的相互转换
简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。即:
Boolean(boolean value);
Character(char value);
Integer(int value);
Long(long value);
Float(float value);
Double(double value)
而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
1.2.3.3. String类和其它数据类型的相互转换
对于上面的这些包装类,除了Character以外,都有可以直接使用字符串参数的构造函数,这也就使得我们将String类转换为这些数据类型变得相当之简单,即:
Boolean(String s);
Integer(String s);
Long(String s);
Float(String s);
Double(String s);
现在我们还剩下一个字符型变量,事实上String类可以理解为一个char型数组,因此我们可以在String类中找到这样的方法来实现这种转换:charAt(int index)可以得到String类中某一位置上的字符,toCharArray()更可以将整个String类转换成一个char的数组。
对于所有的包装类都存在一个名为toString()的方法可以将其转换成对应的String类,而对于整型类和长整型类,还可以使用toBinaryString(int i)、toHexString(int i)、toOctalString(int i)分别以二进制、十六进制和八进制的形式进行到String类的转换。
1.2.3.4. 字符型直接做为数值转换为其它数据类型
将字符型变量转换为数值型变量实际上有两种对应关系,在我们在第一部分所说的那种转换中,实际上是将其转换成对应的ASCII码,但是我们有时还需要另一种转换关系,例如,‘1’就是指的数值1,而不是其ASCII码,对于这种转换,我们可以使用Character的 getNumericValue(char ch)方法。
package com.minght.sys.util;
public class ObjConvert {
private ObjConvert() {
}
/*********************基本类型与包装器的相互转化****************/
/**
* 将Integer包装器转化成int基本类型
* @param I Integer
* @return int
*/
public static int integerToInt(Integer I){
if(I==null)
return 0;
int i = I.intValue();
return i;
}
/**
* 将int基本类型转化成Integer包装器对象
* @param i int
* @return Integer
*/
public static Integer intToInteger(int i){
Integer I = new Integer(i);
return I;
}
/**
* 将Charater 包装器对象转化成char基本类型
* @param C Character
* @return char
*/
public static char charaterToChar(java.lang.Character C){
if(C==null)
return '0';
char c = C.charValue();
return c;
}
/**
* 将char基本类型转化成Charater 包装器对象
* @param c char
* @return Character
*/
public static Character charToCharater(char c){
Character C = new Character('c');
return C;
}
/**
* 将Long 包装器对象转化成long基本类型
* @param L Long
* @return long
*/
public static long LongTolong(Long L){
if(L==null){
return 0l;
}
long l = L.longValue();
return l;
}
/**
* 将long基本类型转化为Long包装器对象
* @param l long
* @return Long
*/
public static Long longToLong(long l){
Long L = new Long(l);
return L;
}
/**
* 将Float包装器对象转化为float基本类型
* @param F Float
* @return float
*/
public static float FloatTofloat(Float F){
if(F==null){
return -1f;
}
float f = F.floatValue();
return f;
}
/**
* 将float基本类型转化为Float包装器对象
* @param f float
* @return Float
*/
public static Float floatToFloat(float f){
Float F = new Float(f);
return F;
}
/**
* 将Double包装器对象转化为double基本类型
* @param D Double
* @return double
*/
public static double DoubleTodouble(Double D){
if(D==null)
return 0D;
double d = D.doubleValue();
return d;
}
/**
* 将double基本类型转化为Double包装器对象
* @param d double
* @return Double
*/
public static Double doubleToDouble(double d){
Double D = new Double(d);
return D;
}
/**
* 将Boolean包装器对象转化为boolean基本类型
* @param B Boolean
* @return boolean
*/
public static boolean BooleanToboolean(Boolean B){
if(B==null)
return false;
boolean b = B.booleanValue();
return b;
}
/**
* 将boolean基本类型转化为Boolean对象类型
* @param b boolean
* @return Boolean
*/
public static Boolean booleanToBoolean(boolean b){
Boolean B = new Boolean(b);
return B;
}
/***************************各类型与string类型的相互转换***********************/
/**
* 将String对象转化为int基本类型
* @param s String
* @return int
*/
public static int sToi(String s){
int i = -1;
if(s==null || s.trim().length()==0){
return i;
}
try{
i = Integer.parseInt(s);
}catch(Exception e){
Debug.print("Stirng convet to int error ! ");
return i;
}
return i;
}
/**
* 将int类型转化为String
* @param i int
* @return String
*/
public static String iTos(int i){
String s = intToInteger(i).toString();
return s;
}
/**
* 将string类型转化为long类型
* @param s String
* @return long
*/
public static long sTol(String s ){
long l = -1L;
if(s==null || s.trim().length()==0){
return l;
}
try{
l = Long.parseLong(s);
}catch(Exception e){
Debug.println("String convert to long error!");
return l;
}
return l;
}
/**
* 将long类型转化为String类型
* @param l long
* @return String
*/
public static String lTos(long l){
String s = longToLong(l).toString();
return s;
}
/**
* 将string类型转化为float类型
* @param s String
* @return float
*/
public static float sTof(String s){
float f = -1f;
if(s==null || s.length()==0){
return f;
}
try{
f = Float.parseFloat(s);
}catch(Exception e){
Debug.println("String convert to float error");
return f;
}
return f;
}
/**
* 将float类型转化为String类型
* @param f float
* @return String
*/
public static String fTos(float f){
String s = floatToFloat(f).toString();
return s;
}
/**
* 将string类型转化为double类型
* @param s String
* @return double
*/
public static double sTod(String s){
double d = -1d;
if(s==null || s.length()==0){
return d;
}
try{
d = Double.parseDouble(s);
}catch(Exception e){
Debug.println("String convert to double error");
return d;
}
return d;
}
/**
* 将double类型转化为String类型
* @param d double
* @return String
*/
public static String dTos(double d){
String s = doubleToDouble(d).toString();
return s;
}
/**
* 测试
* @param args String[]
*/
public static void main(String[] args){
Integer I = new Integer(10);
int i = integerToInt(I);
System.out.println("convert Integer to int :"+i);
}
}
1.2.4. 高精度数字
Java 提供了两个类专门用于进行高精度运算BigInteger 和BigDecimal ,尽管它们可大致划分到与封装器相同的类别里,但两者都没有对应的主类型;这两个类都有自己的一系列方法,类似于我们针对主类型执行的操作,也就是说能用int 或float 做的事情,用BigInteger和BigDecimal 一样可以做,只是必须换用方法调用,而不是使用运算符。此外由于牵涉更多,所以运算速度会慢一点总之我们牺牲了速度,但换来了精度。
1.2.4.1. 高精度整数BigInteger
BigInteger支持任意精度的整数,也就是说我们可精确表示任意大小的整数值;同时在运算过程中不会丢失任何信息;
在BigInteger类中有所有的基本算术运算方法,如加、减、乘、除,以及可能会用到的位运算如或、异或、非、左移、右移等。下面是一些方法的例子:当然,如果要有更多的使用方法,可以查阅java api 。
package com.minght.test;
import java.math.*;
/**
*
* <p>Title: 开源,开放</p>
* <p>Description: opeansource</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: ?海棠</p>
* @author HaiTang Ming
* @version 1.0
*/
public class BigIntegerTest {
public BigIntegerTest() {
}
/**
* 测试BigInteger
*/
public static void testBigInteger() {
BigInteger bi = new BigInteger("888");
//multiply :乘法
BigInteger result = bi.multiply(new BigInteger("2"));
System.out.println(result);
//divide : 除法
result = bi.divide(new BigInteger("2"));
System.out.println(result);
//add : 加法
result = bi.add(new BigInteger("232"));
System.out.println(result);
//subtract :减法
result = bi.subtract(new BigInteger("23122"));
System.out.println(result);
result = bi.shiftRight(2);
System.out.println(result);
}
public static void main(String[] args) {
testBigInteger();
}
}
1.2.4.2. 高精度浮点数BigDecimal
一些非整数值(如几美元和几美分这样的小数)需要很精确。浮点数不是精确值,所以使用它们会导致舍入误差。因此,使用浮点数来试图表示象货币量这样的精确数量不是一个好的想法。使用浮点数来进行美元和美分计算会得到灾难性的后果。浮点数最好用来表示象测量值这类数值,这类值从一开始就不怎么精确。
从 JDK 1.3 起,Java 开发人员就有了另一种数值表示法来表示非整数:BigDecimal。BigDecimal 是标准的类,在编译器中不需要特殊支持,它可以表示任意精度的小数,并对它们进行计算。在内部,可以用任意精度任何范围的值和一个换算因子来表示 BigDecimal,换算因子表示左移小数点多少位,从而得到所期望范围内的值。因此,用 BigDecimal 表示的数的形式为 unscaledValue*10-scale。
用于加、减、乘和除的方法给 BigDecimal 值提供了算术运算。由于 BigDecimal 对象是不可变的,这些方法中的每一个都会产生新的 BigDecimal 对象。因此,因为创建对象的开销,BigDecimal 不适合于大量的数学计算,但设计它的目的是用来精确地表示小数。如果您正在寻找一种能精确表示如货币量这样的数值,则 BigDecimal 可以很好地胜任该任务。
如浮点类型一样,BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals() 方法来检测数值之间是否相等时要小心。equals() 方法认为,两个表示同一个数但换算值不同(例如,100.00 和 100.000)的 BigDecimal 值是不相等的。然而,compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals()。
另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如,1 除以 9 会产生无限循环的小数 .111111...。出于这个原因,在进行除法运算时,BigDecimal 可以让您显式地控制舍入。movePointLeft() 方法支持 10 的幂次方的精确除法。
对于 BigDecimal,有几个可用的构造函数。其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用 BigDecimal(double) 构造函数,因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。
如果使用 BigDecimal(double) 构造函数不恰当,在传递给 JDBC setBigDecimal() 方法时,会造成似乎很奇怪的 JDBC 驱动程序中的异常。例如,考虑以下 JDBC 代码,该代码希望将数字 0.01 存储到小数字段:
PreparedStatement ps =
connection.prepareStatement("INSERT INTO Foo SET name=?, value=?");
ps.setString(1, "penny");
ps.setBigDecimal(2, new BigDecimal(0.01));
ps.executeUpdate();
在执行这段似乎无害的代码时会抛出一些令人迷惑不解的异常(这取决于具体的 JDBC 驱动程序),因为 0.01 的双精度近似值会导致大的换算值,这可能会使 JDBC 驱动程序或数据库感到迷惑。JDBC 驱动程序会产生异常,但可能不会说明代码实际上错在哪里,除非意识到二进制浮点数的局限性。相反,使用 BigDecimal("0.01") 或 BigDecimal(1, 2) 构造 BigDecimal 来避免这类问题,因为这两种方法都可以精确地表示小数。
package com.minght.sys.util;
import java.math.BigDecimal;
/**
*
* <p>Title: 开源,开放</p>
* <p>Description: opeansource</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: ?海棠</p>
* @author HaiTang Ming
* @version 1.0
*/
public class BigDecimalUtil {
//默认除法运算精度,及即保留小数点多少位
private static final int DEF_DIV_SCALE = 2;
//这个类不能实例化
private BigDecimalUtil (){
}
/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.add(b2)).doubleValue();
}
/**
* 提供精确的减法运算。
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.subtract(b2)).doubleValue();
}
/**
* 提供精确的乘法运算。
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.multiply(b2)).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后多少位,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1,double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return (b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP)).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return (b.divide(one,scale,BigDecimal.ROUND_HALF_UP)).doubleValue();
}
public static void main(String[] args){
double a = 123.345678;
double d = round(a,2);
Debug.println("round("+a+",2)--->"+d);
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/akglk/archive/2006/06/25/833131.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/akglk/archive/2006/06/25/833131.aspx
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/akglk/archive/2006/06/25/833131.aspx
相关推荐
1_引言&微机知识杂论.pdf
能源杂论 安杰逻:我们怎么看新能源.pdf
### 软件架构杂论的关键知识点 #### 一、软件架构的概念与重要性 - **背景**: 随着软件技术的飞速发展,软件规模不断扩大,开发周期缩短,行业分工细化,市场竞争加剧,软件架构的重要性日益凸显。 - **核心价值**:...
能源杂论 太阳能、风能是环保的新能源吗.pdf
能源杂论 开拓新能源和金融创新的双赢路径.pdf
能源杂论 新能源客车2015年1月销量数据分析.pdf
能源杂论 新能源再成两会热点 混合动力能否咸鱼翻生.pdf
能源杂论 严重雾霾倒逼产业发展 新能源汽车2014年或迎爆发期.pdf
【铁路系统中的空转滑行与粘着问题】 在铁路运输中,空转滑行现象是一种常见的不正常状态,对列车的牵引力和制动性能产生严重影响。空转是指车轮在钢轨上高速转动,而牵引力却无法有效传递,导致车轮与钢轨之间发生...
断验杂论四柱平和,不争妒。(原局四柱中和,无冲克争战,主性格随和,不与他人争锋。)年月日时在一旬,金榜题名显威,乐而忘忧。(此乃先贤口诀,六十花甲共有六旬,甲子、甲戌、甲申、甲午、甲辰、甲寅,每旬各有
杂论 - **常量折算**: nesC中的常量表达式可以在编译时计算出结果。 - **编译时常量函数**: 某些函数可以在编译时求值,提高运行效率。 #### 四、nesC语言的实际应用场景 - **无线传感器网络**: nesC主要应用于...
- 了解各类文学体裁的特点和分类,如古代诗、词、曲、史传、小说、杂论等。 - 掌握文学流派、文学社团和文学运动等重要历史背景知识。 5. 默写常见的名句名篇的要求: - 内容上:思想性、艺术性与哲理性兼备,...
文学体裁常识的掌握包括对诗歌、散文、小说、戏剧等不同文体的特征和分类的理解,特别是古代文体如诗、词、曲、史传、小说和杂论。同时,学生还需了解文学史上有影响力的流派、社团和运动,以增进对文学发展的全面...
该系统可以将杂论无章的信息经过组织,合理有序地呈现在大家面前。 系统的功能与要求: 1. 招聘管理:系统可以对招聘信息进行管理,包括发布招聘信息、统计应聘信息等。 2. 岗位管理:系统可以对岗位信息进行管理...
5. 《几何原本杂论》的作者是徐光启,这是中国历史上对古希腊数学著作《几何原本》的研究。 数学学习部分涉及: 1. 偶数与正整数的比较:偶数和正整数数量一样多,因为每个正整数都可以对应一个偶数(自身或自身+1...
22. **数学著作**:《几何原本杂论》是徐光启翻译的西方数学著作。 23. **有理数、无理数与实数的关系**:有理数和无理数都是实数的子集,实数包含了有理数和无理数。 24. **旋转体的体积**:椭圆绕轴旋转形成的...
- 全书共分五大部分:文道论、创作论、鉴赏批评论、文体论及杂论。 - 该书不仅是文学理论的经典之作,也是中国文学史上一部重要的文献。 ### 二、“知音”中的同情体验与孤独体验 1. **同情体验**(“觇文见心”...
《快递批量查件1.32.zip:快递物流批量查询技术详解》 在现代电子商务盛行的时代,快递物流已经成为日常生活中不可或缺的一部分。对于商家而言,批量处理快递查询的需求日益凸显,因此,"快递批量查件1.32.zip"这样...