当前位置: 主页 > JAVA语言

java除法保留两位小数-mysql除法保留2位小数

发布时间:2023-05-21 07:08   浏览次数:次   作者:佚名

实际的java项目中,不可避免地使用到各种运算,比如生成各种报表,数据的汇总等。对于这些问题,大致有2种解决途径,一种是在数据库查询时进行相关运算,直接得到所需要汇总计算后的结果;另外一种,是根据查询到的数据进行运算加工成所需的汇总数据。

当然,就实际情况而言,是推荐使用第一种的,毕竟所有的或者说大部分的运算都通过数据库进行,可以节省时间,提高效率。但是,实际情况是,在绝大多数的情况下,只通过查询来进行汇总不太现实java除法保留两位小数,毕竟,有些汇总的逻辑是很复杂的,不可避免地还要对查询出来的数据进行再加工。加工的基础,当然就是最简单的java运算了,通过运算符或者是Math类提供的方法进行运算。但是,现实情况是,这些简单的运算可能不能满足绝大部分的运算需求,这时,就需要使用java中专业的数学运算类BigInteger和BigDecimal,本文简单讲述BigDecimal的使用。

先来看一个问题,简单的算术运算

double value1 = 0.06;

double value2 = 0.01;

//常规运算

System.out.println("*******常规算术运算*********");

//加法+

System.out.println(value1+"+"+value2+"="+(value1+value2));

//减法-

System.out.println(value1+"-"+value2+"="+(value1-value2));

运算结果会是什么呢?

0.06+0.01=0.07

0.06-0.01=0.05

显然不是,上述代码的运算结果为:

java除法保留两位小数_int除法保留两位小数_mysql除法保留2位小数

在实际的运算中,需要对更大或者更小的数进行运算和处理时,我们不能使用传统的+、-、*、/等算术运算符直接进行数学运算,而要使用用java.math.BigDecimal。BigDecimal所创建的是对象,通过调用其相对应的方法进行数学运算。

BigDecimal常见构造方法

BigDecimal(int) 创建一个具有参数所指定整数值的对象。

BigDecimal(double) 创建一个具有参数所指定双精度值的对象。

BigDecimal(long) 创建一个具有参数所指定长整数值的对象。

BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。

在上述构造方法中,最常用的是BigDecimal(String),而不是我们先入为主的其他构造方法,在java的API 中强调了这一点:

BigDecimal

int除法保留两位小数_java除法保留两位小数_mysql除法保留2位小数

public BigDecimal(double val)

此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1538729559615387295596153872955967153872955964541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。

当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。

BigDecimal 的运算方式 不支持 + - * / 这类的运算 它有自己的运算方法

BigDecimal add(BigDecimal augend) 加法运算

BigDecimal subtract(BigDecimal subtrahend) 减法运算

BigDecimal multiply(BigDecimal multiplicand) 乘法运算

BigDecimal divide(BigDecimal divisor) 除法运算

add

public BigDecimal add(BigDecimal augend)

subtract

public BigDecimal subtract(BigDecimal subtrahend)

multiply

public BigDecimal multiply(BigDecimal multiplicand)

divide

public BigDecimal divide(BigDecimal divisor,

int scale,

int roundingMode)

下面的代码比较了常规的算术运算和专业的数学运算之间的差别,还有四舍五入的差别

具体代码示例TestBigDecimal.java

package com.company.test;

mysql除法保留2位小数_java除法保留两位小数_int除法保留两位小数

import java.math.BigDecimal;

public class TestBigDecimal {

public static void main(String[] args) {

// TODO Auto-generated method stub

double value1 = 0.06;

double value2 = 0.01;

//常规运算

System.out.println("*******常规算术运算*********");

//加法+

System.out.println(value1+"+"+value2+"="+(value1+value2));

//减法-

System.out.println(value1+"-"+value2+"="+(value1-value2));

//乘法*

System.out.println(value1+"*"+value2+"="+(value1*value2));

//除法/

System.out.println(value1+"/"+value2+"="+(value1/value2));

//java专业运算

System.out.println("*******专业运算*********");

//加法public BigDecimal add(BigDecimal augend)

System.out.println(value1+"+"+value2+"="+add(value1,value2));

//加法可变参数

System.out.println(value1+"+"+value2+"+"+value1+"+"+value2+"="+addMore(value1,value2,value1,value2));

int除法保留两位小数_java除法保留两位小数_mysql除法保留2位小数

//减法public BigDecimal subtract(BigDecimal subtrahend)

System.out.println(value1+"-"+value2+"="+sub(value1,value2));

//乘法public BigDecimal multiply(BigDecimal multiplicand)

System.out.println(value1+"*"+value2+"="+mul(value1,value2));

//除法public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)

System.out.println(value1+"/"+value2+"="+div(value1,value2,2));

//常规运算

System.out.println("*******常规运算(四舍五入)*********");

//四舍五入public static long round(double a)

System.out.println(value1+"四舍五入之后是:"+Math.round(value1));

System.out.println(value2+"四舍五入之后是:"+Math.round(value2));

value1 = 2.287461;

//java专业运算

System.out.println("*******专业运算(四舍五入)*********");

//保留5位小数

System.out.println(value1+"保留5位小数四舍五入之后是:"+round(value1,5));

//保留4位小数

System.out.println(value1+"保留4位小数四舍五入之后是:"+round(value1,4));

//保留3位小数

System.out.println(value1+"保留3位小数四舍五入之后是:"+round(value1,3));

//保留2位小数

System.out.println(value1+"保留2位小数四舍五入之后是:"+round(value1,2));

int除法保留两位小数_java除法保留两位小数_mysql除法保留2位小数

}

//四舍五入

public static double round(double value1, int scale) {

BigDecimal big1 = new BigDecimal(Double.toString(value1));

BigDecimal big2 = new BigDecimal("1");

return big1.divide(big2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();

}

//加法

public static double add(double value1, double value2) {

BigDecimal big1 = new BigDecimal(Double.toString(value1));

BigDecimal big2 = new BigDecimal(Double.toString(value2));

return big1.add(big2).doubleValue();

}

//加法(可变参数)

public static double addMore(double... args) {

double sum = 0;

for(double d:args){

sum=add(sum,d);

}

return sum;

}

//减法

java除法保留两位小数_int除法保留两位小数_mysql除法保留2位小数

public static double sub(double value1, double value2) {

BigDecimal big1 = new BigDecimal(Double.toString(value1));

BigDecimal big2 = new BigDecimal(Double.toString(value2));

return big1.subtract(big2).doubleValue();

}

//乘法

public static double mul(double value1, double value2) {

BigDecimal big1 = new BigDecimal(Double.toString(value1));

BigDecimal big2 = new BigDecimal(Double.toString(value2));

return big1.multiply(big2).doubleValue();

}

//除法

public static double div(double value1, double value2, int scale) {

BigDecimal big1 = new BigDecimal(Double.toString(value1));

BigDecimal big2 = new BigDecimal(Double.toString(value2));

return big1.divide(big2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();

}

}

运算结果:

java除法保留两位小数_mysql除法保留2位小数_int除法保留两位小数

从运算结果可以看出,使用BigDecimal可以保证运算的精度,不会发生丢失精度的现象java除法保留两位小数,同时,可以在保证精度的前提下,保留指定位数的小数,而Math.round是返回整数的。

round

public static long round(double a)

在实际的汇总运算中,需要灵活使用BigDecimal来保证运算的精度。