`
greemranqq
  • 浏览: 966255 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

java 中浮点类型常用计算方法

 
阅读更多

JAVA 浮点类型的计算,我们知道会出现失精的问题,如果程序中经常使用,我的做法是,写一个工具类,专门处理类似问题。

 

	/**
	 * 
	 * @Description:两个double类型相加,返回Double
	 * @createBy:qiqiang ran
	 * @createdate:2012-3-23
	 * @param double d1
	 * @param double d2
	 * @return double
	 */
	public static double doubleAdd(double d1, double d2) {
		BigDecimal a1 = new BigDecimal(d1);
		BigDecimal b1 = new BigDecimal(d2);
		return a1.add(b1).doubleValue();
	}

 

那么用BigDecimal 就完全可以解决了吗?我找到这样一句话:
Note: the results of this constructor can be somewhat unpredictable.
One might assume that new BigDecimal(.1) is exactly equal to .1, 
but it is actually equal to .1000000000000000055511151231257827021181583404541015625. 
This is so because .1 cannot be represented exactly as a double (or, for that
matter, as a binary fraction of any finite length). 
Thus, the long value that is being passed in to the constructor is not exactly 
equal to .1, appearances nonwithstanding. 

The (String) constructor, on the other hand, is perfectly predictable: 

new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, 

it is generally recommended that the (String) constructor be used in preference 

to this one.(转《Effective Java》

我了解了一下,BigDecimal 有4个构造方法,具体的大家可以去看看,这里强调了是着两个:
BigDecimal(String val){...};
BigDecimal(double val){...};
而我们通常使用的是 构造double val,但是从刚才那段说明中得知:字符串的构造函数优先于另一个。
那么我们现在的方法可以这样改进:

 

	/**
	 * 
	 * @Description:两个double类型相加,返回Double
	 * @createBy:qiqiang ran
	 * @createdate:2012-3-23
	 * @param double d1
	 * @param double d2
	 * @return double
	 */
	public static double doubleAdd(double d1, double d2) {
		BigDecimal a1 = new BigDecimal(Double.toString(d1));
		BigDecimal b1 = new BigDecimal(Double.toString(d2));
		return a1.add(b1).doubleValue();
	}
同理可得:我们可以提供相应 - * / 方法,分别对应:.subtract .multiply .div 方法。
注意:运算过程中需要注意参数,以及保留位数,比如:除法运算,里面方法很多,大家可以尝试。 
最后:这个以前就遇到过,只是临时copy 过来用用,老是不明白,
后来自己多写写,多领悟好多了,虽然还有很多不明白的地方,
但是相信自己动手 动脑去完成,总会搞清楚的。也给新入行的人提醒,
最好别一味的copy代码,哪怕是上面两行最简单的代码,写一次就深刻一次,
这也是我不将后面方法写完的原因。还有关于JS 计算也有同样的问题,
大家也可以去研究研究。

 

分享到:
评论

相关推荐

    java深入解析

    通过以上方面介绍那些常见、常用却少为人知的Java知识。虽然内容相对基本,但都不是容易解答的。目前更多的开发人员(不乏多年开发经验者),也仅仅停留在Java表面的层次,而本书,将更深入一层地去讨论Java的话题...

    学通Java的24堂课

    3.4.3 浮点类型 69 3.4.4 字符类型 69 3.4.5 布尔类型 71 3.5 数据类型转换 71 3.5.1 自动类型转换 71 3.5.2 强制类型转换 73 3.6 运算符 74 3.6.1 赋值运算符 74 3.6.2 算术运算符 75 3.6.3 自增和自减...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例170 方法中抛出异常 218 实例171 方法上抛出异常 219 实例172 自定义异常类 220 实例173 捕获单个异常 221 实例174 捕获多个异常 222 第8章 枚举与泛型的应用 223 8.1 枚举使用的简介 224 实例175 查看枚举类型...

    【02-数据类型与运算符】

    Xxx的含义与前一个方法中Xxx相同。 基本数据类型  •Java 的基本数据类型可以分为两大类: boolean 类型 和 数值类型.  •而数值类型又可以分为整型和浮点型  –整型包括:byte short int long(广义的...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书为中南大学精品教材立项项目,分为上下两篇共21章,涵盖了面向对象技术中Java开发环境配置、程序设计基础、面向对象原理以及UML的知识。本书使用的开发环境是JDK 1.6+Eclipse 3.3+Rational Rose 2003,逐步引领...

    javaSE代码实例

    15.2.3 静态方法中的局部内部类 331 15.3 静态内部类 332 15.3.1 语法规则 332 15.3.2 创建静态内部类的对象 332 15.3.3 静态/非静态内部类的区别 333 15.4 匿名内部类 334 15.4.1 基于继承的匿名内部...

    java课程设计-科学计算器.doc

    2 需求分析 2.1 设计背景 设计这个计算器主要是参考Windows操作系统中自带的计算器,由于编者水平和时间的限 制,不能将计算器设计到科学型及其他更复杂的类型,在设计过程中还参考了一些其他 的优秀设计。...

    freemarker语法完整版

    最常用的 3 个概念 sequence 序列,对应java 里的list 、数组等非键值对的集合 hash 键值对的集合 namespace 对一个ftl 文件的引用, 利用这个名字可以访问到该ftl 文件的资源 B 指令 if, else, elseif ...

    JavaScript基础和实例代码

    6.1.9 常见属性和方法汇总 6.2 Math对象 6.2.1 基本数学运算 6.2.2 任意范围随机数发生器 6.2.3 访问其基本属性 6.2.4 使用with声明简化表达式 6.2.5 常见属性汇总 6.2.6 常见方法汇总 6.3 Array对象 6.3.1 创建数组...

    源文件程序天下JAVASCRIPT实例自学手册

    6.5.4 常见属性和方法汇总 6.6 Boolean对象 6.6.1 创建Boolean对象的实例 6.6.2 将Boolean对象转化为字符串 6.6.3 常见属性和方法汇总 6.7 Function对象 6.7.1 两个概念:Function与function 6.7.2 使用Function...

    EL表达式的详细使用

    JSP 表达式语言提供以下操作符,其中大部分是 Java 中常用的操作符: 术语 定义 算术型 +、-(二元)、*、/、div、%、mod、-(一元) 逻辑型 and、&&、or、||、!、not 关系型 ==、eq、!=、ne、、gt、、le、>...

    MYSQL常用命令大全

    MySql的用户管理是通过 User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。其中GRANT的常用用法如下: grant all on mydb...

    Visual C++ 2005入门经典--源代码及课后练习答案

    2.3.5 浮点类型 48 2.3.6 ISO/ANSI C++中的基本类型 49 2.3.7 字面值 50 2.3.8 定义数据类型的同义词 50 2.3.9 具有特定值集的变量 51 2.3.10 指定枚举常量的类型 52 2.4 基本的输入/输出操作 53 ...

    mysql官方中文参考手册

    3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天...

    MYSQL中文手册

    3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8....

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    2.3.5 浮点类型 46 2.3.6 字面值 47 2.3.7 定义数据类型的同义词 48 2.3.8 具有特定值集的变量 49 2.4 基本的输入/输出操作 50 2.4.1 从键盘输入 50 2.4.2 到命令行的输出 50 2.4.3 格式化输出 51 2.4.4 ...

    Python核心编程第二版(ok)

     6.17.2 元组类型操作符和内建函数.c内建方法   6.18 元组的特殊特性   6.18.1 不可变性给元组带来了什么影响   6.18.2 元组也不是那么“不可变”   6.18.3 默认集合类型   6.18.4 单元素元组   ...

Global site tag (gtag.js) - Google Analytics