近来在项目中使用到了一个数据库SQL语句,这个SQL语句是动态生成的,类似下面的方式:
Doublequantity=...;
Stringsql="INSERTINTO"+tableName+"(id,name,quantity)VALUES("
+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位小数点输出:
DecimalFormatdf=
newDecimalFormat("#.0000");
doubled=12345678.12345;
StringdStr=df.format(d);
这样dStr就变成了:1234567.1234,而不会是:1.234567812345E7的形式了。
了解Java中对浮点数的输出表示,并时时熟记于心,尤其对于一些面向普通用户的企业应用中,注意在适当的地方对浮点数进行格式化是非常重要的。对于一些SQL驱动器也要了解是否识别这种科学计数法形式,否则,就等于为系统埋下了一颗不定时的,什么时候爆炸并不知道,也许是在几年之后,那么在那时寻找问题、修正程序将变得非常困难。
分享到:
相关推荐
Java输入浮点数分别输出整数部分和小数部分
java 浮点数举例java 浮点数举例java 浮点数举例
NULL 博文链接:https://spiritfrog.iteye.com/blog/602147
用java从文件中读取浮点数 已经亲自实践过,没有问题
给大家介绍了Java中浮点数精度问题的解决方法,本文给大家介绍的非常详细,有问题描述有原因分析,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
该案例演示了浮点数的应用
疯狂java讲义里的课后题,自己编写的程序
Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是不会抛异常,而是得出无穷大的结果.本工具类解决了上述问题.该类提供了加减乘除四则运算的精确计算...
[Java]IEEE754浮点数的转换方法,方法都写好了,直接复制过去就可以用了,就这么简单!
Java源码获取浮点数类型的最大最小值
MODBUS RTU协议中浮点数的相互转换 从浮点数到整形,以及从整形到浮点数 带简单的协议说明文档
4.15实验-浮点数的表示及运算
输出浮点数四字节的内容,将32位浮点数以四字节的形式输出
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。
C语言中浮点数精度问题分析.pdf
Java中如何正确进行浮点数运算 演示错误运算方式产生的结果 演示正确运算方式产生的结果
单精度浮点数,双精度浮点数,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
STEP7 Wincc中变量如何显示小数或浮点数?
适用于java的小练习.希望对大家有帮助.
关于浮点数的精度问题,对于了解和学习C语言有一定帮助