Java 中的数值运算-BigDecimal
2012-12-24 13:59
375 查看
遇到这么一个问题,
结果输出的是:
((0.7-0.4))==0.29999999999999993;
搜索了下,这里就需要使用 BigDecimal 类.
它有两个构造方法:
BigDecimal(double val)
Translates a double into a BigDecimal.
BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
如果想要精确计算,一定要使用第二种方法.
但每次都需要将浮点数转换成String,再将String转化成BigDecimal,调用其数学方法继续计算,再将结果转换成浮点数.
下面使用一个工具类来封装下加减乘除四种方法.
public static void main(String[] args) {System.out.print("((0.7-0.4))=="); System.out.print(((0.7-0.4))); }
结果输出的是:
((0.7-0.4))==0.29999999999999993;
搜索了下,这里就需要使用 BigDecimal 类.
它有两个构造方法:
BigDecimal(double val)
Translates a double into a BigDecimal.
BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
如果想要精确计算,一定要使用第二种方法.
但每次都需要将浮点数转换成String,再将String转化成BigDecimal,调用其数学方法继续计算,再将结果转换成浮点数.
下面使用一个工具类来封装下加减乘除四种方法.
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(); } };
相关文章推荐
- Java中的Bigdecimal类型运算
- 【java】BigDecimal、BigInteger、大数相乘、数值的整数次方、快速乘法
- Java BigDecimal 加减乘除运算
- Java笔记:位运算之异或交换数值原理
- 【JAVA核心技术】 大数值 BigDecimal
- java中数值相关计算方法及BigDecimal的用法
- java.math.BigDecimal、BinInteger类的用法(用于精确运算)
- java BigDecimal实现精确加减乘除运算(例如:京东结算)
- BigDecimal 除法运算出现 java.lang.ArithmeticException
- JAVA BigDecimal 高精度运算
- java中float,double利用BigDecimal运算
- Java工具类之——BigDecimal运算封装(包含金额的计算方式)
- Java的数值精度的输出控制(包含BigDecimal)
- BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result的解决办法
- 今天开始学Java 将相同索引的数值进行求和运算,输出按照key值升序进行输出。
- BigDecimal除法运算出现java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result的解决办法
- java 大数值BigInteger与BigDecimal
- 使用Java BigDecimal进行精确运算
- Java中的Bigdecimal类型运算
- Java--交换两个变量的值的三种方法:借助中间量交换,数值相加减交换,位移运算交换