- 浏览: 107616 次
- 来自: 杭州
文章分类
最新评论
-
lc2178890:
朋友,你在线吗?能不能在线交流一下,我也有遇见这个问题,不过是 ...
客户端用https连接服务器的一点心得 -
lj0910:
楼主 你的这个实现了吗? 能不能指教下。
用js如何打印网页中的某张图片。 -
goglad:
朋友,没有那么复杂吧,我更具tomcat document里面 ...
客户端用https连接服务器的一点心得 -
lzycxy:
我也出现了你这类似的问题,不知道你上述的问题解决了没有,如果解 ...
tomcat 配置 jmx -
baoqf:
网页上的图片点鼠标右键有个菜单叫“打印图片...”,我想用js ...
用js如何打印网页中的某张图片。
Java 理论与实践: 您的小数点到哪里去了?使用浮点数和小数中的技巧和陷阱 |
级别: 初级 Brian Goetz (brian@quiotix.com), 首席顾问, Quiotix Corp 2003 年 4 月 20 日 许多程序员在其整个开发生涯中都不曾使用定点或浮点数,可能的例外是,偶尔在计时测试或基准测试程序中会用到。Java语言和类库支持两类非整数类型 ― IEEE 754 浮点(<!----><!----><!----> 虽然几乎每种处理器和编程语言都支持浮点运算,但大多数程序员很少注意它。这容易理解 ― 我们中大多数很少需要使用非整数类型。除了科学计算和偶尔的计时测试或基准测试程序,其它情况下几乎都用不着它。同样,大多数开发人员也容易忽略 Java 语言支持两种基本的浮点类型: IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。IEEE 浮点数用 1 位表示数字的符号,用 8 位来表示指数,用 23 位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数 2)小数来表示,这意味着最高位对应着值 ?(2 -1),第二位对应着 ?(2 -2),依此类推。对于双精度浮点数,用 11 位表示指数,52 位表示尾数。IEEE 浮点值的格式如图 1 所示。 图 1. IEEE 754 浮点数的格式 因为用科学记数法可以有多种方式来表示给定数字,所以要规范化浮点数,以便用底数为 2 并且小数点左边为 1 的小数来表示,按照需要调节指数就可以得到所需的数字。所以,例如,数 1.25 可以表示为尾数为 1.01,指数为 0: 数 10.0 可以表示为尾数为 1.01,指数为 3: 除了编码所允许的值的标准范围(对于 这些特殊的数字有一些不寻常的特征。例如,
使事情更糟的是,在基本
由于无穷大、NaN 和
浮点运算很少是精确的。虽然一些数字(譬如
类似的,
将得到以下输出:
这可能不是您起初所期望的。
由于存在 NaN 的不寻常比较行为和在几乎所有浮点计算中都不可避免地会出现舍入误差,解释浮点值的比较运算符的结果比较麻烦。 最好完全避免使用浮点数比较。当然,这并不总是可能的,但您应该意识到要限制浮点数比较。如果必须比较浮点数来看它们是否相等,则应该将它们差的绝对值同一些预先选定的小正数进行比较,这样您所做的就是测试它们是否“足够接近”。(如果不知道基本的计算范围,可以使用测试“abs(a/b - 1) < epsilon”,这种方法比简单地比较两者之差要更准确)。甚至测试看一个值是比零大还是比零小也存在危险 ―“以为”会生成比零略大值的计算事实上可能由于积累的舍入误差会生成略微比零小的数字。 NaN 的无序性质使得在比较浮点数时更容易发生错误。当比较浮点数时,围绕无穷大和 NaN 问题,一种避免 gotcha 的经验法则是显式地测试值的有效性,而不是试图排除无效值。在清单 1 中,有两个可能的用于特性的 setter 的实现,该特性只能接受非负数值。第一个实现会接受 NaN,第二个不会。第二种形式比较好,因为它显式地检测了您认为有效的值的范围。 清单 1. 需要非负浮点值的较好办法和较差办法
一些非整数值(如几美元和几美分这样的小数)需要很精确。浮点数不是精确值,所以使用它们会导致舍入误差。因此,使用浮点数来试图表示象货币量这样的精确数量不是一个好的想法。使用浮点数来进行美元和美分计算会得到灾难性的后果。浮点数最好用来表示象测量值这类数值,这类值从一开始就不怎么精确。
从 JDK 1.3 起,Java 开发人员就有了另一种数值表示法来表示非整数: 用于加、减、乘和除的方法给 如浮点类型一样, 另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如, SQL-92 包括 如果希望将数字存储到数据库中的 对于 对于 如果使用
在执行这段似乎无害的代码时会抛出一些令人迷惑不解的异常(这取决于具体的 JDBC 驱动程序),因为
在 Java 程序中使用浮点数和小数充满着陷阱。浮点数和小数不象整数一样“循规蹈矩”,不能假定浮点计算一定产生整型或精确的结果,虽然它们的确“应该”那样做。最好将浮点运算保留用作计算本来就不精确的数值,譬如测量。如果需要表示定点数(譬如,几美元和几美分),则使用 |
发表评论
-
tomcat 配置 jmx
2007-09-24 13:19 58961.在tomcat/bin/catalina.sh中这句改为: ... -
客户端用https连接服务器的一点心得
2007-06-27 21:43 31052客户端用https连接服务器的一点心得 项目需要用h ... -
Struts 应用转移到Struts 2
2006-12-23 19:30 2643关键字: Struts2 ... -
解决windows下编辑的shell文件unix下不能用的问题
2007-09-24 13:19 1818如果在windows下编辑的shell文件,shell文件中第 ... -
Java 程序中的多线程
2006-07-23 16:05 1243Java 程序中的多线 ... -
编写tapestry页面时碰到的问题集锦
2004-09-24 19:50 1134popup window如何做? 在服务器端如何输出javas ... -
eclipse 技巧、问题及解决
2004-09-24 20:38 1335启动eclipse 时出错,problems during s ... -
struts 问题集
2004-09-24 20:55 1472struts form提交普通控件时,Action中得到的值是 ... -
使用axis部署webservice
2004-09-24 21:03 2476部署axis时把java类改成jws文件,放在Axis根目录下 ... -
eclipse3.0中使用lomboz的注意问题
2004-09-24 21:13 945eclipse必须先按装emf ( eclipse model ... -
Java程序员面试陷阱大全
2004-10-18 10:37 1001谈谈final, finally, finalize的区别 ...
相关推荐
本文叙述了除了科学计算和偶尔的计时测试或基准测试程序,其它情况下几乎都用不着它。同样,大多数开发人员也容易忽略java.math.BigDecimal所提供的任意精度的小数-大多数应用程序不使用它们。然而,在以整数为主的...
Excel表格怎么筛选带有小数点的数据?.docx
本文主要讲了单片机怎么显示小数点?数码管小数点显示程序,下面一起来学习一下
34-显示小数点(51单片机C语言实例Proteus仿真和代码)34-显示小数点(51单片机C语言实例Proteus仿真和代码)34-显示小数点(51单片机C语言实例Proteus仿真和代码)34-显示小数点(51单片机C语言实例Proteus仿真和代码)34-...
进位法,小数点处理进位法,小数点处理
sql取小数点后N位sql取小数点后N位sql取小数点后N位
ABAP 编程: ABAP ALV取消整数小数点后面的0
用DS18B20精确到小数点后一位的温度测量实现,C语言。
一个计算根号2到小数点后任意位的python代码。因为Python支持大数运算,所以代码很简单,才12行。
获取float类型小数点位数,先将数据转换为varchar类型,然后对转换后的数据进行翻转,获取小数点所在的位置即可
WPF 输入数字和小数点的文本框,支持输入0-9的数字,小数点和删除键,其他的键都被禁止输入
js 实现 截断小数点位数! 值得下载看看!资源免费,大家分享!!
textbox 文本内避免输入两个小数点的啊!!
51单片机教程实例34-显示小数点
本资源可以满足金额有关的一些input框输入,只能输入类似10.001的数据,并且小数点前第一位不能是0,我使用这个是为了管理后台做版本控制,我们只需要1.11这种格式的版本号
_小数点搬家.ppt
input框输入时,因为数值的特殊要求。...以及数字+小数点+符号-。也就是两种类型的限制。数字和小数点。以及负数和小数点。并且小数点不能出现在第一位,并且只能出现一次。-只能出现在第一位,并且只能出现一次。
arduino 超声波测距代码 精确到小数点后两位
1、可以动态设置小数点的前几位和后几位,进行实时校验; 2、通过正则表达式判断,超过设置的范围就不能输入了; 3、只能输入数字和小数点; 4、已经封装好的插件,可以直接使用。有使用的示例和必要的注释。
计算PI值到小数点后10000位的C代码