- 浏览: 602880 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
limeng650419:
想要将一个项目类生成在同一个类图怎么办》?
PowerDesigner导入java类生成类图 -
q77102902:
一语道破天机啊!
Weblogic 数据源及连接池配置问题Warning! Connectivity to backend database not verified -
chaliszhou:
收藏下,!!!
JAVA读写文件,如何避免中文乱码 -
lal324:
同上 顶起来
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/di -
luchuan10000:
非常正确!!!
JAVA读写文件,如何避免中文乱码
double、float类型不能精确的表示0.1
double d1 = 5.85;
double d2 = 3.21;
所以d1 - d2 = 2.6399999999999997
此时可以使用如下方法(根据小数点位数进行扩增),但要防止数值越界
double d = d1*100 - d2*100;
d = d/100;
System.out.println(d);
或者使用BigDecimal 进行精确运算
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
double result = bd1.subtract(bd2).doubleValue();
System.out.println(result);
BigDecimal 的更多说明
解决方案
现在我们已经可以解决这个问题了,原则是使用BigDecimal并且一定要用String来够造。
但是想像一下吧,如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,
在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。你
能够忍受这么烦琐的过程吗?下面我们提供一个工具类Arith来简化操作。它提供以下静态方法,包括加减
乘除和四舍五入:
public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)
附录
源文件Arith.java:
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
*/
public class Arith{
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
//这个类不能实例化
private Arith(){
}
/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算。
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后10位,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1,double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
};
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/scorpio3k/archive/2009/03/19/4006061.aspx
double d1 = 5.85;
double d2 = 3.21;
所以d1 - d2 = 2.6399999999999997
此时可以使用如下方法(根据小数点位数进行扩增),但要防止数值越界
double d = d1*100 - d2*100;
d = d/100;
System.out.println(d);
或者使用BigDecimal 进行精确运算
BigDecimal bd1 = new BigDecimal(Double.toString(d1));
BigDecimal bd2 = new BigDecimal(Double.toString(d2));
double result = bd1.subtract(bd2).doubleValue();
System.out.println(result);
BigDecimal 的更多说明
解决方案
现在我们已经可以解决这个问题了,原则是使用BigDecimal并且一定要用String来够造。
但是想像一下吧,如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,
在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。你
能够忍受这么烦琐的过程吗?下面我们提供一个工具类Arith来简化操作。它提供以下静态方法,包括加减
乘除和四舍五入:
public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)
附录
源文件Arith.java:
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
*/
public class Arith{
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
//这个类不能实例化
private Arith(){
}
/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算。
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后10位,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1,double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
};
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/scorpio3k/archive/2009/03/19/4006061.aspx
发表评论
-
List对象排序
2013-04-11 17:21 1111参照http://jardot.iteye.com/blog ... -
File "/WEB-INF/c.tld" not found
2010-04-13 23:07 4085org.apache.jasper.JasperExcepti ... -
HashMap
2010-04-13 12:19 1054package TestExample; import ja ... -
Convert from String to float
2010-02-07 16:52 1578public class Main { public st ... -
java Date类型:24小时制和12小时制
2010-01-16 04:01 2454HH:mm:ss 为24小时 hh:mm:ss ... -
java.util.date 和 java.sql.date 两者之间有什么不同?
2010-01-16 03:45 1343java.util.Date 就是在除了SQL语句的情况下面使 ... -
JAVA读写文件,如何避免中文乱码
2010-01-15 11:28 22237最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
JAVA读取文件,避免中文乱码
2010-01-15 11:24 13271、JAVA读取文件,避免中文乱码。 /** * 读取 ... -
java日期和字符串的转换
2010-01-15 10:43 1008把日期转换为字符串: Date date = new Date ... -
Java读写cookie
2009-10-20 17:23 1118/* * 写cookie */ Cookie namecoo ... -
J2EE J2SE J2ME介绍
2009-08-10 11:12 1026自从Sun推出Java以来,就力图使之无所不包,所以Java发 ... -
Io 异常: The Network Adapter could not establish the connection
2009-07-17 10:42 17571。IP错误。 在设置URL时错误,例如:jdbc:oracl ... -
CalendarDemo
2009-06-24 15:18 974package test; import java.uti ... -
冒泡排序基本思想及示例代码
2009-06-24 15:05 1672package test; /** * Created b ... -
百钱百鸡问题编程
2009-06-24 15:05 1426某人拿着100块钱去买鸡,公鸡5元一只,母鸡3元一只,小鸡1元 ... -
web.xml中load-on-startup介绍
2009-06-17 09:35 1291在servlet的配置中,<load-on-startu ... -
求一个数字数组中含有各个数字的个数以及最大的个数
2009-06-15 10:24 1246请各位看到后,有什么高招,我学习下。 我的代码如下: publ ... -
Html标签中的Alt和Title
2009-06-11 11:50 2262Alt和Title都是提示性语言标签,请注意它们之间的区别。 ... -
java 时间函数
2009-06-09 11:29 1208注意:java.util和java.sql中都有Date这个类 ... -
java.lang.Thread
2009-05-21 14:12 1206一:理解多线程 多 ...
相关推荐
然而,在某些情况下,我们可能需要将BigDecimal类型的值转换为Double类型,比如为了与一些只接受基本数据类型或其包装类的方法参数兼容,或者进行一些基于Double的数学运算等。本文将详细介绍如何在Java中实现...
Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...
使用BigDecimal进行精确运算的步骤如下: 1. **创建BigDecimal对象**:你可以通过传入String表示的数值来创建BigDecimal对象,或者使用`BigDecimal.valueOf()`静态方法,将基本类型(如double)转换为BigDecimal。...
Java 中的 BigDecimal 类提供了对浮点数的精确运算,包括加减乘除和四舍五入等操作。在 Java 中,简单类型不能够精确地对浮点数进行运算,因此需要使用 BigDecimal 类来提供精确的浮点数运算。 加法运算 在 Java ...
在Java编程中,进行高精度的数学计算时,通常会使用`java.math.BigDecimal`类,因为Java中的简单数据类型如`float`和`double`在处理大数或精确计算时可能会出现误差。`BigDecimal`类提供了加减乘除等运算方法,确保...
使用BigDecimal进行精确运算通常包括以下几个步骤: 1. **创建BigDecimal对象**:你可以通过`new BigDecimal(double)`构造函数或者`BigDecimal.valueOf(double)`静态方法将double类型的值转换为BigDecimal对象。...
本文将深入探讨 `BigDecimal` 类的基本概念、特点以及如何使用它来进行精确的算术运算。 #### 一、基本概念 `BigDecimal` 类提供了一种可以进行任意精度定点数算术的方法。这意味着它可以存储一个数值的任意小数...
示例代码中的`sub(Double d1, Double d2)`方法展示了如何使用`BigDecimal`来进行减法运算。首先,将`Double`类型的参数转换成`BigDecimal`对象,然后调用`subtract()`方法进行减法操作,最后再使用`doubleValue()`...
3. 精确的加法运算:使用 BigDecimal 的 add 方法可以进行精确的加法运算,例如将两个 BigDecimal 对象相加并返回结果。 4. 精确的减法运算:使用 BigDecimal 的 subtract 方法可以进行精确的减法运算,例如将两个 ...
BigDecimal工具类 BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法...BigDecimal工具类提供了很多实用的方法,可以帮助我们优化数学运算。
首先,创建 BigDecimal 对象,进行 BigDecimal 的算术运算后,分别建立对货币和百分比格式化的引用,最后利用 BigDecimal 对对象进行格式化控制。 BigDecimal 类是 Java 中一种非常重要的数值类型,用于处理超过 16...
此外,`BigInteger`类用于处理整数的大规模精确运算,与`BigDecimal`一起构成了Java的高精度计算支持。 总结来说,Java中处理浮点数的精度问题通常采用`BigDecimal`类,它可以提供精确的十进制运算。通过使用`...
* (由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入) * @author chenke * @time 2017/12/5 16:22 * @mail ch_chenke@163.com */ public class Arith...
Java 中的双精度浮点数(double)类型在进行运算时经常出现精度丢失的问题,这是由于双精度浮点数在计算机内部的存储方式所致。双精度浮点数使用 64 位二进制数来存储小数,然而这种存储方式会导致某些小数无法精确...
由于 double 和 float 类型在处理大数或需要绝对精确计算的场景下存在精度损失,因此 BigDecimal 成为了商业计算和金融计算的标准工具。 在使用 BigDecimal 时,我们需要通过构造函数来创建对象,通常我们会传入一...
为了解决这个问题,Java提供了`BigDecimal`类,用于进行精确的十进制算术运算。这篇博客将深入探讨`BigDecimal`的使用,以及如何通过它来实现精确计算。 `BigDecimal`是Java `java.math`包下的一个类,它提供了任意...
`BigDecimal` 类是 Java 中用于高精度浮点数计算的关键工具,主要解决 `float` 和 `double` 类型在处理货币、财务等需要精确计算场景时存在的精度问题。`BigDecimal` 的运算方式与基本数据类型有所不同,因为它涉及...
这样,我们可以将Double类型的数据转换为BigDecimal对象,以便进行精确的数学运算。 二、BigDecimal去掉科学计数法 在使用BigDecimal类时,默认情况下,数字会以科学计数法显示。可以使用java.text.NumberFormat类...
总之,理解和掌握Java中的浮点数存储和运算特性,以及如何利用`BigDecimal`进行精确计算,是每个Java开发者必备的知识点。在进行浮点数运算时,务必考虑精度问题,并根据实际情况选择合适的方法,以避免潜在的错误和...
Java 中的浮点数类型 float 和 double 在进行运算时会出现不精确的问题,这是因为计算机无法精确地表示十进制小数。这种问题不仅存在于 Java 中,在其它许多编程语言中也存在。 问题的提出: 编译运行下面的 Java ...