浏览器速度大比拼:Firefox 4 VS Internet Explorer 9 VS Chrome VS Opera
2011-3-24 by 活科技
浏览器速度大比拼:Firefox 4 VS Internet Explorer 9 VS Chrome VS Opera
这个月可以称为浏览器大战月, Internet Explorer、Chrome和Firefox都推出了新版本,而浏览器Opera亦继续定期更新。这里有来自lifehacker的专业测试,看看这些浏览器的第二次启动时间、加载时间、JavaScript的能力和内存使用等比较。

[ 阅读全文 ]

5个更佳处理 PDF文件的工具
2011-3-14 by 活科技
5个更佳处理 PDF文件的工具
PDF的确成为了标准的电子文件格式。其实,巿面上除有许多 PDF工具可以选择去使用,以下介绍五个最佳处理 PDF文件的工具。

[ 阅读全文 ]

上周10篇你不能错过的《活科技》文章 (7/3-13/3)
2011-3-14 by 活科技
上周10篇你不能错过的《活科技》文章 (7/3-13/3)
活科技每天都提供大量资讯,可能你会错过了一些热门的文章,以下是上周(7/3-13/3)你不能错过的热门文章:

[ 阅读全文 ]

快得令其他网览器吃尘,更快的Google Chrome 10 登场!
2011-3-9 by 活科技
快得令其他网览器吃尘,更快的Google Chrome 10 登场!
网络浏览器的大战真的没完没了,Google刚宣布 Chrome 10推出正式版,这意味着你现在可以下载这个 STABLE版了。Google 称Chrome 10行JavaScript性能会快66%。Google 还改良后的设置界面和Flash视频。

[ 阅读全文 ]

iPad2不是你想像的快?!iPad2 的网页浏览Benchmarks测试公布
2011-3-8 by 活科技
iPad2不是你想像的快?!iPad2 的网页浏览Benchmarks测试公布
CNETUK在iPad1及iPad2上运行SunSpider的JavaScript测试,虽然iPad2有一个双核心处理器,运行JavaScript的速度测试比iPad1快只有1.5倍。此外,CNETUK亦发现,4.3iPad的运行速度比iOS4.2跑得更快,这表明iPad用户可以更新iOS4.3来提速。
当然,这个测试结果只注重于网页浏览上,iPad2的CPU的确比iPad1的利害,详细结果需等APPLE的iPad2出货后才知道。

[ 阅读全文 ]

关注开源 刘理志
2010-11-18 by lizhi
2010年11月15日星期一上午11:47
  分析自己要实事求是,分析环境要客观公正。
  制定目标要长短结合,落实目标||浏览()2010年11月09日星期二上午09:27百度身边,刚通过朋友邀请加入后,我一打开,从意识就开始觉得他也是仿造国外
的一种模式来运营和赚钱的,并且我以前也是非常看好这种方式的,毕竟这个里
面有明确的赚钱的动向。可以让大家能够通过有效的方式,也可以赚到钱。嘿嘿!
我也把自己几个有效邀请链接发给各位,大家去申请吧!
    ||浏览()2010年11月08日星期一下午05:52UsingNotepad++toCompileandRunJavaPrograms||浏览()2010年11月08日星期一下午01:44相应大家在使用AMFPHP进行FLASH与PHP的通讯的时候,可能会遇到很多问题:
如php版本的原因,因为里面有很些代码在书写的时候,没有注意到,也无法及时更新上PHP版本和一些function的更新,如会经常提示的:Functioneregi_replace()isdeprecated当出现这种错误的时候,更多的是因为PHP的版本的原因。PHP5.3无法支持你的这个function了,所以您不得不通过支持的function来替换掉他们。
  修改/amfphp/core/shared/util/MethodTa||浏览()2010年11月07日星期日下午10:38我在写这文章的时候,我的手已经开始不听话,因为我刚从体育场回来,做了好几个小时的运动,并且可能是我在这公司来,最激励的一次,我们在场不断的活动,手,全身都在活动中得到了满足。从而让我们这天有了一个更美好的一天。好吧,我先说我们今天的安排吧,今天我们早早的在公司这儿集合,说好准备去上海老街这儿玩。中午在那儿吃饭,太棒了。终于让我们的星期天没有像以前那样,在寂寞中度过了。我兴奋的带上自己的相机(500D),跑到公司这儿,还真巧,公司老板娘也带上他的游玩必备武器(7D)。结果她的一出手,我的就只||浏览()2010年11月01日星期一下午02:23-.Ant简介
Ant是一个类似make的工具,用来编译/运行/测试java程序。
构建、包装和发布过程中几乎每一件事都可以由Ant的任务来处理.二.Ant的安装及配置
你可以从Jakata网站下载预编译的ANT,解压至任一目录;
设置自己的环境变量,即ANT_HOME,指向解压目录;
设置JAVA_HOME环境变量,指向jdk的根目录;三:用ant管理项||浏览()2010年11月01日星期一下午01:08公司管理中的人性化,对于每家公司来家都是希望能够以这种方式来取得员工的一
个同情或者说,公司对他们的重视。但对这些,我并没有太多的一个追求,或者说
我们的管理中或者说人员的修养还没有达到这种境界。因为员工的根本无法理解到
一个人性化到底是一个什么东西,或者说什么叫人性化,还有一个度的把控。因
为人都有着自己的思维模式,这些思维模式在很多方面都跟环境,教育这些因素有
关系的。
  我拿一个很简单的案子解说下,我在实际||浏览()2010年10月28日星期四上午10:43#/bin/bash
shijie=`date+%Y%m%d`
backRenRenDb=renren_minishijie$shijie.sql
back4399Db=4399_minishijie$shijie.sql
backManyouDb=Manyou$shijie.sql
backRenRenFile=renren$shijie.tar.gz
back4399File=file4399$shijie.tar.gz
backManyouFile=Manyou$shijie.tar.gz
password=123456
cd/var/www/back
mysqldump-uroot-p$password--default-character-set=utf8--opt--extended-insert=false--triggers-R--hex-blob--single-transactionrenren$backRenRenDb
echo-e||浏览()2010年10月21日星期四下午03:45大家都知道,google提供很多优秀的服务,并且免费给大家使用,这也是她所能够
这么成功的一个很重要的原因吧。并且她做的相应产品也真的是没有办法说不,
他们真的是花了心思去做了。无可厚非,我们现在还在一直使用着google所提供的
服务,如gmail,reader,document,说实话,对于中国的用户来讲,真的是太难过
了!因为实在太多优秀的产品,我们都得通过VPN方式来访问,并且由于中国的带
宽方面确实不咱的,经常会出现Timeout。根本无法享受科技的进步。我们就不
得不选择||浏览()2010年10月18日星期一下午11:33
使用googlecalendar来有效的管理好你的时间||浏览()2010年10月18日星期一下午09:25基本格式:
*****command
分时日月周命令
第1列表示分钟1~59每分钟用*或者*/1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令
crontab文件的一些例子:
3021***/usr/local/etc/rc.d/lighttpdrestart
上面的例子表示每晚的21:30重启apache。
4541,10,22**/usr/local/etc/rc.d/lighttpdrestart
上面的例子表示每月1、10、22日的4:4||浏览()2010年10月13日星期三下午03:34由于项目的一些优化的需求。所以我们得不断的寻找出新的方法来不断的提取现在的MySQL性能,可能大家听到这个需求的时候,肯定会想到那些SQL之类的优化方式,还有通过修改my.cnf配置文件来提升Mysql性能.再或者就是通过硬件的方式来提供性能了。我相信我们在这块已经做了相应的努力了,并且应该是结合了大家比较优秀的做法来操作我们现在的DatabaseServer,但我们还是觉得速度上无法达到满足。从而就有了我们以下的想法:||浏览()2010年10月13日星期三下午03:33现在各大Blog提供商都在慢慢的提供着通过邮件方式来Blog了,这确实是一种非常不错的建议,国外有www.blogger.com,||浏览()2010年10月12日星期二上午11:51[学习方法]1.使用googlealert通过邮件订阅自己喜欢的内容(google搜索出来的结果提供的)2.使用邮件列表方式,加入邮件列表中,有什么变化就可以及时通过邮件方式通知到你3.使用rss方式来跟踪自己喜欢的内容信息,包括技术文章,新闻,时事等各各方面(goodsreader)4.facebook,twritter,sina等方式查看最新动态。5.使用wiki方式来学习更多的优秀,正确的内容现在很多方面都是离不开邮件的作用的,请好好的使用好自己的邮箱。||浏览()2010年10月11日星期一下午01:17
  我们在这篇文章中主要向大家讲了一些PHP插件机制的实现方法。希望大家可以通过本问介绍的内容初步了解对PHP插件机制的认识。
  插件,亦即Plug-in,是指一类特定的功能模块(通常由第三方开发者实现),它的特点是:当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁||浏览()

[ 阅读全文 ]

Java ME Mobile Application Development Services
2010-10-12 by Mobile App
Java ME Mobile Application Development Services
Java ME Mobile Development is a based on CLDC/MIDP and different JSRs. This technology enables you to build sophisticated applications for multiple devices with confidence. Java ME uses scaled down subsets of Java SE components, virtual machines and APIs. For more details please visit us at http://www.mobiledevelopmentindia.com

[ 阅读全文 ]


Java多态性详解——父类引用子类对象 - Java 编程 - 编程开发 - 伊甸网
2010-7-16 by 恨雪
面向对象编程有三个特征,即封装、继承和多态。
  封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据。

  继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢?

  方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来的非常强大的功能,但是复杂的继承关系也给C++开发者带来了更大的麻烦,为了规避风险,Java只允许单继承,派生类与基类间有IS-A的关系(即“猫”is a “动物”)。这样做虽然保证了继承关系的简单明了,但是势必在功能上有很大的限制,所以,Java引入了多态性的概念以弥补这点的不足,此外,抽象类和接口也是解决单继承规定限制的重要手段。同时,多态也是面向对象编程的精髓所在。

  要理解多态性,首先要知道什么是“向上转型”。

  我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类。我可以通过

  Cat c = new Cat();

  实例化一个Cat的对象,这个不难理解。但当我这样定义时:

  Animal a = new Cat();

  这代表什么意思呢?

  很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,

  定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。

  所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;

  同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;

  对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。

  看下面这段程序:

  class Father{

  public void func1(){

  func2();

  }

  //这是父类中的func2()方法,因为下面的子类中重写了该方法

  //所以在父类类型的引用中调用时,这个方法将不再有效

  //取而代之的是将调用子类中重写的func2()方法

  public void func2(){

  System.out.println(";AAA";);

  }

  }

  class Child extends Father{

  //func1(int i)是对func1()方法的一个重载

  //由于在父类中没有定义这个方法,所以它不能被父类类型的引用调用

  //所以在下面的main方法中child.func1(68)是不对的

  public void func1(int i){

  System.out.println(";BBB";);

  }

  //func2()重写了父类Father中的func2()方法

  //如果父类类型的引用中调用了func2()方法,那么必然是子类中重写的这个方法

  public void func2(){

  System.out.println(";CCC";);

  }

  }

  public class PolymorphismTest {

  public static void main(String[] args) {

  Father child = new Child();

  child.func1();//打印结果将会是什么?

  }

  }

  上面的程序是个很典型的多态的例子。子类Child继承了父类Father,并重载了父类的func1()方法,重写了父类的func2()方法。重载后的func1(int i)和func1()不再是同一个方法,由于父类中没有func1(int i),那么,父类类型的引用child就不能调用func1(int i)方法。而子类重写了func2()方法,那么父类类型的引用child在调用该方法时将会调用子类中重写的func2()。

  那么该程序将会打印出什么样的结果呢?

  很显然,应该是“CCC”。

  对于多态,可以总结它为:

  一、使用父类类型的引用指向子类的对象;

  二、该引用只能调用父类中定义的方法和变量;

  三、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;(动态连接、动态调用)

  四、变量不能被重写(覆盖),”重写“的概念只针对方法,如果在子类中”重写“了父类中的变量,那么在编译时会报错。

  ****************************************************************************************************************************

  多态详解(整理)2008-09-03 19:29多态是通过:

  1 接口 和 实现接口并覆盖接口中同一方法的几不同的类体现的

  2 父类 和 继承父类并覆盖父类中同一方法的几个不同子类实现的.

  一、基本概念

  多态性:发送消息给某个对象,让该对象自行决定响应何种行为。

  通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

  java 的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

  1. 如果a是类A的一个引用,那么,a可以指向类A的一个实例,或者说指向类A的一个子类。

  2. 如果a是接口A的一个引用,那么,a必须指向实现了接口A的一个类的实例。

二、Java多态性实现机制

  SUN目前的JVM实现机制,类实例的引用就是指向一个句柄(handle)的指针,这个句柄是一对指针:

  一个指针指向一张表格,实际上这个表格也有两个指针(一个指针指向一个包含了对象的方法表,另外一个指向类对象,表明该对象所属的类型);

  另一个指针指向一块从java堆中为分配出来内存空间。

  三、总结

  1、通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。

  DerivedC c2=new DerivedC();

  BaseClass a1= c2; //BaseClass 基类,DerivedC是继承自BaseClass的子类

  a1.play(); //play()在BaseClass,DerivedC中均有定义,即子类覆写了该方法

  分析:

  * 为什么子类的类型的对象实例可以覆给超类引用?

  自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型BaseClass;

  * a.play()将执行子类还是父类定义的方法?

  子类的。在运行时期,将根据a这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个基类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。

  在a1=c2的时候,仍然是存在两个句柄,a1和c2,但是a1和c2拥有同一块数据内存块和不同的函数表。

  2、不能把父类对象引用赋给子类对象引用变量

  BaseClass a2=new BaseClass();

  DerivedC c1=a2;//出错

  在java里面,向上转型是自动进行的,但是向下转型却不是,需要我们自己定义强制进行。

  c1=(DerivedC)a2; 进行强制转化,也就是向下转型.

  3、记住一个很简单又很复杂的规则,一个类型引用只能引用引用类型自身含有的方法和变量。

  你可能说这个规则不对的,因为父类引用指向子类对象的时候,最后执行的是子类的方法的。

  其实这并不矛盾,那是因为采用了后期绑定,动态运行的时候又根据型别去调用了子类的方法。而假若子类的这个方法在父类中并没有定义,则会出错。

  例如,DerivedC类在继承BaseClass中定义的函数外,还增加了几个函数(例如 myFun())

  分析:

  当你使用父类引用指向子类的时候,其实jvm已经使用了编译器产生的类型信息调整转换了。

  这里你可以这样理解,相当于把不是父类中含有的函数从虚拟函数表中设置为不可见的。注意有可能虚拟函数表中有些函数地址由于在子类中已经被改写了,所以对象虚拟函数表中虚拟函数项目地址已经被设置为子类中完成的方法体的地址了。

  4、Java与C++多态性的比较

  jvm关于多态性支持解决方法是和c++中几乎一样的,

  只是c++中编译器很多是把类型信息和虚拟函数信息都放在一个虚拟函数表中,但是利用某种技术来区别。

  Java把类型信息和函数信息分开放。Java中在继承以后,子类会重新设置自己的虚拟函数表,这个虚拟函数表中的项目有由两部分组成。从父类继承的虚拟函数和子类自己的虚拟函数。

  虚拟函数调用是经过虚拟函数表间接调用的,所以才得以实现多态的。

  Java的所有函数,除了被声明为final的,都是用后期绑定。

  四. 1个行为,不同的对象,他们具体体现出来的方式不一样,

  比如: 方法重载 overloading 以及 方法重写(覆盖)override

  class Human{

  void run(){输出 人在跑}

  }

  class Man extends Human{

  void run(){输出 男人在跑}

  }

  这个时候,同是跑,不同的对象,不一样(这个是方法覆盖的例子)

  class Test{

  void out(String str){输出 str}

  void out(int i){输出 i}

  }

  这个例子是方法重载,方法名相同,参数表不同

  ok,明白了这些还不够,还用人在跑举例

  Human ahuman=new Man();

  这样我等于实例化了一个Man的对象,并声明了一个Human的引用,让它去指向Man这个对象

  意思是说,把 Man这个对象当 Human看了.

  比如去动物园,你看见了一个动物,不知道它是什么, ";这是什么动物? "; ";这是大熊猫! ";

  这2句话,就是最好的证明,因为不知道它是大熊猫,但知道它的父类是动物,所以,

  这个大熊猫对象,你把它当成其父类 动物看,这样子合情合理.

  这种方式下要注意 new Man();的确实例化了Man对象,所以 ahuman.run()这个方法 输出的 是 ";男人在跑 ";

  如果在子类 Man下你 写了一些它独有的方法 比如 eat(),而Human没有这个方法,

  在调用eat方法时,一定要注意 强制类型转换 ((Man)ahuman).eat(),这样才可以...

  对接口来说,情况是类似的...

  实例:

  package domatic;

  //定义超类superA

  class superA {

  int i = 100;

  void fun(int j) {

  j = i;

  System.out.println(";This is superA";);

  }

  }

  // 定义superA的子类subB

  class subB extends superA {

  int m = 1;

  void fun(int aa) {

  System.out.println(";This is subB";);

  }

  }

  // 定义superA的子类subC

  class subC extends superA {

  int n = 1;

  void fun(int cc) {

  System.out.println(";This is subC";);

  }

  }

class Test {

  public static void main(String[] args) {

  superA a = new superA();

  subB b = new subB();

  subC c = new subC();

  a = b;

  a.fun(100);

  a = c;

  a.fun(200);

  }

  }

  /*

  * 上述代码中subB和subC是超类superA的子类,我们在类Test中声明了3个引用变量a, b,

  * c,通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。也许有人会问:

  * ";为什么(1)和(2)不输出:This is superA";。

  * java的这种机制遵循一个原则:当超类对象引用变量引用子类对象时,

  * 被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,

  * 但是这个被调用的方法必须是在超类中定义过的,

  * 也就是说被子类覆盖的方法。

  * 所以,不要被上例中(1)和(2)所迷惑,虽然写成a.fun(),但是由于(1)中的a被b赋值,

  * 指向了子类subB的一个实例,因而(1)所调用的fun()实际上是子类subB的成员方法fun(),

  * 它覆盖了超类superA的成员方法fun();同样(2)调用的是子类subC的成员方法fun()。

  * 另外,如果子类继承的超类是一个抽象类,虽然抽象类不能通过new操作符实例化,

  * 但是可以创建抽象类的对象引用指向子类对象,以实现运行时多态性。具体的实现方法同上例。

  * 不过,抽象类的子类必须覆盖实现超类中的所有的抽象方法,

  * 否则子类必须被abstract修饰符修饰,当然也就不能被实例化了

  */

  以上大多数是以子类覆盖父类的方法实现多态.下面是另一种实现多态的方法-----------重写父类方法

  1.JAVA里没有多继承,一个类之能有一个父类。而继承的表现就是多态。一个父类可以有多个子类,而在子类里可以重写父类的方法(例如方法print()),这样每个子类里重写的代码不一样,自然表现形式就不一样。这样用父类的变量去引用不同的子类,在调用这个相同的方法print()的时候得到的结果和表现形式就不一样了,这就是多态,相同的消息(也就是调用相同的方法)会有不同的结果。举例说明:

  //父类

  public class Father{

  //父类有一个打孩子方法

  public void hitChild(){

  }

  }

  //子类1

  public class Son1 extends Father{

  //重写父类打孩子方法

  public void hitChild(){

  System.out.println(";为什么打我?我做错什么了!";);

  }

  }

  //子类2

  public class Son2 extends Father{

  //重写父类打孩子方法

  public void hitChild(){

  System.out.println(";我知道错了,别打了!";);

  }

  }

  //子类3

  public class Son3 extends Father{

  //重写父类打孩子方法

  public void hitChild(){

  System.out.println(";我跑,你打不着!";);

  }

  }

  //测试类

  public class Test{

  public static void main(String args[]){

  Father father;

  father = new Son1();

  father.hitChild();

  father = new Son2();

  father.hitChild();

  father = new Son3();

  father.hitChild();

  }

  }

  都调用了相同的方法,出现了不同的结果!这就是多态的表现!

本文地址:【伊甸网】http://www.edenw.com/tech/devdeloper/java/2010-07-16/4751.html

[ 阅读全文 ]

Java浮点数丢失精度原因阐述 - Java 编程 - 编程开发 - 伊甸网
2010-7-16 by 恨雪
由于对float或double 的使用不当,可能会出现精度丢失的问题。问题大概情况可以通过如下代码理解:

  Java代码

  public class FloatDoubleTest {

  public static void main(String[] args) {

  float f = 20014999;

  double d = f;

  double d2 = 20014999;

  System.out.println(";f="; + f);

  System.out.println(";d="; + d);

  System.out.println(";d2="; + d2);

  }

  }

  得到的结果如下:

  f=2.0015E7

  d=2.0015E7

  d2=2.0014999E7

  从输出结果可以看出double 可以正确的表示20014999 ,而float 没有办法表示20014999 ,得到的只是一个近似值。这样的结果很让人讶异。20014999 这么小的数字在float下没办法表示。带着这个问题,一起学习一下浮点数,做个简单分享,希望有助于大家对java 浮点数的理解。

  1.关于 java 的 float 和 double 的表示法

  Java 语言支持两种基本的浮点类型: float 和 double 。java 的浮点类型都依据 IEEE 754 标准。IEEE 754 定义了32 位和 64 位双精度两种浮点二进制小数标准。

  IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。

  对于32 位浮点数float用 第1 位表示数字的符号,用第2至9位来表示指数,用 最后23 位来表示尾数,即小数部分。

  float(32位):

  对于64 位双精度浮点数,用 第1 位表示数字的符号,用 11 位表示指数,52 位表示尾数。

  double(64位):

  都是分为三个部分:

  (1) 一个单独的符号位s 直接编码符号s 。

  (2)k 位的幂指数E ,移码表示 。

  (3)n 位的小数,原码表示 。

  2. 什么时候会出现无法表示?

  任何一个数字,在java底层表示都必须转换成这种科学计数法来表示,那么我们来想想看什么时候这个数字会无法表示呢?那么只有两种情形:

  1.幂数不够表示了:这种情况往往出现在数字太大了,超过幂数所能承受的范围,那么这个数字就无法表示了。如幂数最大只能是10,但是这个数字用科学计数法表示时,幂数一定会超过10,就没办法了。

  2.尾数不够表示了:这种情况往往出现在数字精度太长了,如1.3434343233332这样的数字,虽然很小,还不超过2,这种情况下幂数完全满足要求,但是尾数已经不能表示出来了这么长的精度。

  3. 20014999 为什么用 float 没有办法正确表示?

  通过以上分析,应该已经知道,这个数字不大,转换成IEEE754科学计数法之后幂数一定是满足要求的,只是尾数不能表示这么精确的数字了。

  结合 float和double的表示方法,通过分析 20014999 的二进制表示就可以知道答案了。

  以下程序可以得出 20014999 在 double 和 float 下的二进制表示方式。

  Java代码

  public class FloatDoubleTest3 {

  public static void main(String[] args) {

  double d = 20014999;

  long l = Double.doubleToLongBits(d);

  System.out.println(Long.toBinaryString(l));

  float f = 20014999;

  int i = Float.floatToIntBits(f);

  System.out.println(Integer.toBinaryString(i));

  }

  }

  输出结果如下:

  Double:100000101110011000101100111100101110000000000000000000000000000

  Float:1001011100110001011001111001100

  对于输出结果分析如下。对于都不 double 的二进制左边补上符号位 0 刚好可以得到 64 位的二进制数。根据double的表示法,分为符号数、幂指数和尾数三个部分如下:

  0 10000010111 0011000101100111100101110000000000000000000000000000

  对于 float 左边补上符号位 0 刚好可以得到 32 位的二进制数。 根据float的表示法, 也分为 符号数、幂指数和尾数三个部分如下 :

  0 10010111 00110001011001111001100

  绿色部分是符号位,红色部分是幂指数,蓝色部分是尾数。

  对比可以得出:

  符号位都是 0 。

  幂指数为移码表示,两者刚好也相等。

  唯一不同的是尾数。

  在 double 的尾数为: 001100010110011110010111 0000000000000000000000000000 ,省略后面的零,至少需要24位才能正确表示 。

  而在 float 下面尾数为: 00110001011001111001100 ,共 23 位。

  为什么会这样?原因很明显,因为 float 尾数 最多只能表示 23 位,所以 24 位的 001100010110011110010111 在 float 下面经过四舍五入变成了 23 位的 00110001011001111001100 。所以 20014999 在 float 下面变成了 20015000 。

  也就是说 20014999 虽然是在float的表示范围之内,但 在 IEEE 754 的 float 表示法精度长度没有办法表示出 20014999 ,而只能通过四舍五入得到一个近似值。

  小结

  浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运算的时候要特别小心。

  可以考虑采用一些替代方案来实现。如通过 String 结合 BigDecimal 或者通过使用 long 类型来转换。

本文地址:【伊甸网】http://www.edenw.com/tech/devdeloper/java/2010-07-16/4752.html

[ 阅读全文 ]

Java浮点数丢失精度原因阐述 - Java 编程 - 编程开发 - 伊甸网
2010-7-16 by 恨雪
由于对float或double 的使用不当,可能会出现精度丢失的问题。问题大概情况可以通过如下代码理解:

  Java代码

  public class FloatDoubleTest {

  public static void main(String[] args) {

  float f = 20014999;

  double d = f;

  double d2 = 20014999;

  System.out.println(";f="; + f);

  System.out.println(";d="; + d);

  System.out.println(";d2="; + d2);

  }

  }

  得到的结果如下:

  f=2.0015E7

  d=2.0015E7

  d2=2.0014999E7

  从输出结果可以看出double 可以正确的表示20014999 ,而float 没有办法表示20014999 ,得到的只是一个近似值。这样的结果很让人讶异。20014999 这么小的数字在float下没办法表示。带着这个问题,一起学习一下浮点数,做个简单分享,希望有助于大家对java 浮点数的理解。

  1.关于 java 的 float 和 double 的表示法

  Java 语言支持两种基本的浮点类型: float 和 double 。java 的浮点类型都依据 IEEE 754 标准。IEEE 754 定义了32 位和 64 位双精度两种浮点二进制小数标准。

  IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。

  对于32 位浮点数float用 第1 位表示数字的符号,用第2至9位来表示指数,用 最后23 位来表示尾数,即小数部分。

  float(32位):

  对于64 位双精度浮点数,用 第1 位表示数字的符号,用 11 位表示指数,52 位表示尾数。

  double(64位):

  都是分为三个部分:

  (1) 一个单独的符号位s 直接编码符号s 。

  (2)k 位的幂指数E ,移码表示 。

  (3)n 位的小数,原码表示 。

  2. 什么时候会出现无法表示?

  任何一个数字,在java底层表示都必须转换成这种科学计数法来表示,那么我们来想想看什么时候这个数字会无法表示呢?那么只有两种情形:

  1.幂数不够表示了:这种情况往往出现在数字太大了,超过幂数所能承受的范围,那么这个数字就无法表示了。如幂数最大只能是10,但是这个数字用科学计数法表示时,幂数一定会超过10,就没办法了。

  2.尾数不够表示了:这种情况往往出现在数字精度太长了,如1.3434343233332这样的数字,虽然很小,还不超过2,这种情况下幂数完全满足要求,但是尾数已经不能表示出来了这么长的精度。

  3. 20014999 为什么用 float 没有办法正确表示?

  通过以上分析,应该已经知道,这个数字不大,转换成IEEE754科学计数法之后幂数一定是满足要求的,只是尾数不能表示这么精确的数字了。

  结合 float和double的表示方法,通过分析 20014999 的二进制表示就可以知道答案了。

  以下程序可以得出 20014999 在 double 和 float 下的二进制表示方式。

  Java代码

  public class FloatDoubleTest3 {

  public static void main(String[] args) {

  double d = 20014999;

  long l = Double.doubleToLongBits(d);

  System.out.println(Long.toBinaryString(l));

  float f = 20014999;

  int i = Float.floatToIntBits(f);

  System.out.println(Integer.toBinaryString(i));

  }

  }

  输出结果如下:

  Double:100000101110011000101100111100101110000000000000000000000000000

  Float:1001011100110001011001111001100

  对于输出结果分析如下。对于都不 double 的二进制左边补上符号位 0 刚好可以得到 64 位的二进制数。根据double的表示法,分为符号数、幂指数和尾数三个部分如下:

  0 10000010111 0011000101100111100101110000000000000000000000000000

  对于 float 左边补上符号位 0 刚好可以得到 32 位的二进制数。 根据float的表示法, 也分为 符号数、幂指数和尾数三个部分如下 :

  0 10010111 00110001011001111001100

  绿色部分是符号位,红色部分是幂指数,蓝色部分是尾数。

  对比可以得出:

  符号位都是 0 。

  幂指数为移码表示,两者刚好也相等。

  唯一不同的是尾数。

  在 double 的尾数为: 001100010110011110010111 0000000000000000000000000000 ,省略后面的零,至少需要24位才能正确表示 。

  而在 float 下面尾数为: 00110001011001111001100 ,共 23 位。

  为什么会这样?原因很明显,因为 float 尾数 最多只能表示 23 位,所以 24 位的 001100010110011110010111 在 float 下面经过四舍五入变成了 23 位的 00110001011001111001100 。所以 20014999 在 float 下面变成了 20015000 。

  也就是说 20014999 虽然是在float的表示范围之内,但 在 IEEE 754 的 float 表示法精度长度没有办法表示出 20014999 ,而只能通过四舍五入得到一个近似值。

  小结

  浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用 float 和 double 作精确运算的时候要特别小心。

  可以考虑采用一些替代方案来实现。如通过 String 结合 BigDecimal 或者通过使用 long 类型来转换。

本文地址:【伊甸网】http://www.edenw.com/tech/devdeloper/java/2010-07-16/4752.html

[ 阅读全文 ]

诊断 Java 代码: 设计“可测试的”应用程序 - ITJava
2010-3-7 by hahaad
在 诊断 Java 代码的这一部分中,Eric Allen 暂停了对具体错误模式的讨论,转而选择讨论关于设计易于、甚至我们乐于测试的软件的问题。他概述了七条设计原则,这些原则能大幅提高您编写测试代码的效率并因此提高结果代码库的健壮性。请在 讨论论坛与作者和其它读者共享您关于本文的心得

[ 阅读全文 ]

Jar114.Com是一个JAVA类包搜索引擎。能够解决JAVA开发中遇到的“找不到类”
2009-7-27 by zhouqiangzho
Jar114.Com是一个JAVA类包搜索引擎。能够解决JAVA开发中遇到的“找不到类”
JAVA类包搜索引擎。提供JAVA类包信息的查找、下载等服务。能够解决JAVA开发中遇到的“找不到类”(NoClassDefFoundError、ClassNotFoundException)的错误。

[ 阅读全文 ]

大学生实习不是目的培养工作能力才是关键
2009-5-27 by seojob
墙上贴满了已就业学员的感言和许多企业将前来挑选人才的就业信息,不时的有学员驻足观看。一位王姓学员告诉笔者,他的专业是计算机应用与管理,来此以前去招聘会碰了很多次的壁,因为技术不过关也没什么经验,一直找不到合适的工作。后来他便来国信蓝点报了名,学自己最喜欢的java开发技术。“反正在这里积攒的项目经验也可以交换学校的实习成绩。”在国信蓝点,和这位王同学情况类似的人大有所在,大部分都是在学校没学到有用的东西的应届毕业生。关于对未来的打算,这位同学说:“现在不怕了,学长们从国信蓝点出去了都能找到很好的工作,我自信不比他们学的差,找个java开发的工作是肯定没问题的!”而国信蓝点教务部的老师也向笔者证实

[ 阅读全文 ]

最好的JAVA论坛
2009-5-15 by 收者
最好的JAVA论坛.名帅指点.在线提问.免费JAVA视频资源下载

[ 阅读全文 ]

JAVA培训
2009-5-15 by 收者
JAVA培训,MLDN软件实训中心.

[ 阅读全文 ]

24小时最热
关于我们 联系我们 常见问题 用户条款 隐私政策 工具 支持者 手机版  在微博
   订阅本站到:
Copyright ©2005 -2012 DIGLOG.COM All Rights Reserved.
备案 ICP备10208362号 · 渝公网备500106015-00086

Server:0ms & Client:ms