中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > JDK核心API
Java中浮点数的输出形式及可能引起的问题
作者:未知 时间:2005-07-24 21:14 出处:JR 责编:chinaitpower
              摘要:Java中浮点数的输出形式及可能引起的问题

    近来在项目中使用到了一个数据库SQL语句,这个SQL语句是动态生成的,类似下面的方式:
  1.     Double quantity = ...;
  2.     String sql = "INSERT INTO " + tableName + " (id, name, quantity) VALUES(" 
  3. + id + ",'" + name + "'," + quantity + ")";

    系统正常运行1年多了,突然近段时间系统出错。由于生产环境缺乏充分的调试信息,所以,调试非常困难。经过艰苦的追踪和调试输出,发现问题出现在Double型的quantity的字符串表示上。因为近期系统中quantity遇到了一个比较大的值(大于了10的7次方),而Double型的quantity这儿解析为了类似“1.153E7”的科学计数法形式,虽然大部分的SQL兼容的驱动器基本都认识这种科学计数法形式的数字表示形式,但还是有一些不支持(是否SQL规范中有规定我不清楚,欢迎大家求证)。对于一些不支持这种数字表示形式的驱动器,问题就出来了,它会把它当成一个非法的数字从而报错。

在Java中浮点数包括基本型float、double,以及对象包装类型的Float和Double,对于这些浮点数的输出,不管是显式地还是隐式地调用toString()得到它的表示字串,输出格式都是按照如下规则进行的:
    
  • 如果绝对值大于0.001、小于10000000,那么就以常规的小数形式表示。

  •     
  • 如果在上述范围之外,则使用科学计数法表示。即类似于1.234E8的形式。


清楚这些,就可以避免一些问题,另外,对于大多数的企业应用,用户更倾向于使用普通的小数表示形式,而不是科学计数法的表示形式,所以,在实际项目中也经常会遇到需要把Java中浮点数默认的表示形式统一为普通小数形式输出的问题,可以使用java.text.DecimalFormat进行转换,比如,把double型的转换为保留4位小数点输出:

  1. DecimalFormat df = new DecimalFormat("#.0000");
  2. double d = 12345678.12345;
  3. String dStr = df.format(d);


这样dStr就变成了:1234567.1234,而不会是:1.234567812345E7 的形式了。
    
    了解Java中对浮点数的输出表示,并时时熟记于心,尤其对于一些面向普通用户的企业应用中,注意在适当的地方对浮点数进行格式化是非常重要的。对于一些SQL驱动器也要了解是否识别这种科学计数法形式,否则,就等于为系统埋下了一颗不定时的炸弹,什么时候爆炸并不知道,也许是在几年之后,那么在那时寻找问题、修正程序将变得非常困难。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有