BigDecimal.divide方法中必须设置roundingMode,不然会报错。...ROUND_UP:向正无穷方向对齐(转换为正无穷方向最接近的所需数值) ROUND_DOWN:向负无穷方向对齐 ROUND_CEILING:向原点的反方向对齐 ROUND_FLOOR:向原点方向对齐 ROUND_HALF_UP...:“四舍五入”,如果舍弃部分的最高位大于等于 5,向正无穷方向对齐,否则向负无穷方向对齐 ROUND_HALF_DOWN:“五舍六入”,如果舍弃部分的最高位大于 5,向正无穷方向对齐,否则向负无穷方向对齐...ROUND_HALF_EVEN:“四舍六入五成双”,如果舍弃部分的最高位大于等于六,或等于五并且前一位是奇数,向正无穷方向对齐,否则向负无穷方向对齐 ROUND_UNNECESSARY:如果需要舍入,
BigDecimal.ROUND_UNNECESSARY 翻译:舍入模式可以断言所请求的操作具有准确的结果,因此不需要舍入。...如果在产生不精确结果的操作上指定了这种舍入模式,则会引发ArithmeticException。 解释:计算结果必须是精确的,不需要舍入的,否则抛出 ArithmeticException。...{ BigDecimal bigDecimal1 = new BigDecimal("0.12345"); BigDecimal bigDecimal2 = new BigDecimal("-0.12345..."); // 正确 System.out.println(bigDecimal1.setScale(6, BigDecimal.ROUND_UNNECESSARY...)); // 错误,需要舍入,结果不明确,抛出异常ArithmeticException System.out.println(bigDecimal2.setScale
参数类型为double的构造方法的结果有一定的不可预知性。...有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625...BIgDecimal(double):当double必须用作BigDecimal的源时,请注意,此构造方法提供了一个准确转换之后,才用Double.toString(double)方法,然后使用BigDecimal...BigDecimal(String) :这个一看就看出来了,直接就使用BigDecimal(String)构造方法了,这个是最好的。...总结:推荐使用BigDecimal.valueof(String) 和 BingDecimal(String) 这两个方法,不会出现精度的问题。
我们建议尽可能使用字符串来初始化BigDecimal对象,以避免这种情况发生。 舍入模式 在高精度计算中,舍入可能是必要的。...BigDecimal 提供了 RoundingMode 枚举,可以通过该枚举设置舍入模式。在使用BigDecimal进行除法或设置精度时,指定正确的舍入模式非常重要。...以下是一些可用的舍入模式: RoundingMode.UP - 向远离零的方向舍入,即向正无穷大方向舍入 RoundingMode.DOWN - 向靠近零的方向舍入,即向负无穷方向舍入 RoundingMode.CEILING...- 向最接近的数字舍入,如果与两个相邻数字的距离相等,则向最近的偶数舍入 RoundingMode.HALF_DOWN - 向最接近的数字舍入,如果与两个相邻数字的距离相等,则向远离零的方向舍入 RoundingMode.HALF_EVEN...- 向最接近的数字舍入,如果与两个相邻数字的距离相等,则向最近的偶数舍入,类似于四舍五入 例如,当我们使用BigDecimal进行除法计算时,应指定一个舍入模式,例如: BigDecimal a =
1.BigDecimal加减乘除 //加法 BigDecimal result1 = num1.add(num2); BigDecimal result12 = num12.add(num22);...//减法 BigDecimal result2 = num1.subtract(num2); BigDecimal result22 = num12.subtract(num22); //乘法 BigDecimal...result3 = num1.multiply(num2); BigDecimal result32 = num12.multiply(num22); //绝对值 BigDecimal result4...,,BigDecimal.ROUND_HALF_UP); BigDecimal result52 = num22.divide(num12,,BigDecimal.ROUND_HALF_UP); java...2.BigDecimal累加 或者将 total初始化为0.00 BigDecimal total=BigDecimal.ZERO; for (int i = ; i < ; i++) { BigDecimal
永远不要在丢弃的分数之前增加数字(即截断)。 请注意,此舍入模式永远不会增加计算值的大小 public final static int ROUND_CEILING:舍入模式向正无穷大舍入。...请注意,这是在一系列计算中重复应用时最小化累积误差的舍入模式。...如果丢弃的分数 ≥ 0.5,则行为与ROUND_UP ; 否则,行为与ROUND_DOWN 。 请注意,这是我们大多数人在小学时所教的舍入模式。...是常用的四舍五入方式 public final static int ROUND_UNNECESSARY:舍入模式断言请求的操作具有精确结果,因此不需要舍入。...请注意,此舍入模式永远不会降低计算值的大小。。
不限制长度的浮点数计算【BigDecimal】 目录 BigDecimal四则运算与取模运算 RoundingMode枚举介绍 RoundingMode舍入模式 UP CEILING FLOOR HALF_UP...ROUND_DOWN //向零方向舍入 ROUND_FLOOR //向负无穷方向舍入 ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入...注意,此舍入模式始终不会减少计算值的绝对值。...注意,此舍入模式始终不会增加计算值的绝对值。...,如果与两个相邻数字的距离相等,则向上舍入。
舍入模式) 可以看到舍入模式有很多种BigDecimal.ROUND_XXXX_XXX, 具体都是什么意思呢 计算1÷3的结果(最后一种ROUND_UNNECESSARY在结果为无限小数的情况下会报错...4、ROUND_FLOOR 接近负无穷大的舍入模式。 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同; 如果为负,则舍入行为与 ROUND_UP 相同。...注意,此舍入模式始终不会增加计算值。 5、ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。...6、ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。...7、ROUND_HALF_EVEN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
BigDecimal 的用处 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。...BigDecimal所创建的是对象,故我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。...一种很常用的方法是:使用使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。...(n);// 1.255 BigDecimal 的使用注意事项 注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的 BigDecimal(String) 构造方法来创建对象。...BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念。
1.BigDecimal 的用处 《阿里巴巴Java开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。...);// 0.100000024 System.out.println(b);// 0.099999964 System.out.println(a == b);// false 我们很清楚的知道输出并不是我们想要的结果...一种很常用的方法是:使用使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。...(n);// 1.255 4.BigDecimal 的使用注意事项 注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的 BigDecimal(String) 构造方法来创建对象。...BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念
第三:设置精度的坑 在项目中看到好多同学通过BigDecimal进行计算时不设置计算结果的精度和舍入模式,真是着急人,虽然大多数情况下不会出现什么问题。...如果 BigDecimal 为正,则舍入行为与 ROUNDUP 相同;如果为负,则舍入行为与 ROUNDDOWN 相同。注意,此舍入模式始终不会减少计算值。...RoundingMode.FLOOR:接近负无穷大的舍入模式。如果 BigDecimal 为正,则舍入行为与 ROUNDDOWN 相同;如果为负,则舍入行为与 ROUNDUP 相同。...注意,此舍入模式始终不会增加计算值。 RoundingMode.HALF_UP:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。...RoundingMode.HALF_DOWN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
: ,这边我们要避免这个错误产生,在进行除法运算的时候,针对可能出现的小数产生的计算,必须要多传两个参数 divide(BigDecimal,保留小数点后几位小数,舍入模式) 6.1 舍入模式 ROUND_CEILING...//向正无穷方向舍入 ROUND_DOWN //向零方向舍入 ROUND_FLOOR //向负无穷方向舍入 ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边...() 需要对BigDecimal进行截断和四舍五入可用setScale方法 第一个参数是 设置 保留几位小数 第二个参数是 设置舍入模式 ROUND_CEILING //向正无穷方向舍入...ROUND_DOWN //向零方向舍入 ROUND_FLOOR //向负无穷方向舍入 ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样...“四舍五入” ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式 ROUND_UP //向远离0的方向舍入 8 总结 (1)商业计算使用BigDecimal。
注意,此舍入模式始终不会增加计算值的大小。 ROUND_CEILING 接近正无穷大的舍入模式。...ROUND_FLOOR 接近负无穷大的舍入模式。 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同; 如果为负,则舍入行为与 ROUND_UP 相同。...注意,此舍入模式始终不会增加计算值。 ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。...ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。...ROUND_HALF_EVEN 银行家舍入法 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
Java四舍五入保留两位小数 一、前言 环境 开发工具:IntelliJ IDEA JDK:1.8 二、正文 BigDecimal RoundingMode 算法 说明 ROUND_UP 舍入模式从零舍入...ROUND_DOWN 舍入模式向零舍入 ROUND_CEILING 舍入模式向正无穷大舍入 ROUND_FLOOR 舍入模式向负无穷大舍入 HALF_UP 舍入模式向“最近的邻居”舍入,除非两个邻居是等距的...,在这种情况下向上舍入 HALF_DOWN 舍入模式向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下向下舍入 HAIL_EVEN 舍入模式向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下...,向偶数邻居舍入 UNNECESSARY 舍入模式断言所请求的操作具有精确的结果,因此不需要舍入 代码 double num = 3333.445555; // BigDecimal BigDecimal...bigDecimal = new BigDecimal(num); bigDecimal = bigDecimal.setScale(2, RoundingMode.HALF_UP); System.out.println
1.创建对象 使用new的方式创建BigDecimal对象 BigDecimal a = new BigDecimal("100");//字符串构造 另外建议数值运算使用字符串的方式创建对象,因为:...舍入模式参数") 其中舍入参数: ROUND_CEILING //向正无穷方向舍入 ROUND_DOWN //向零方向舍入 ROUND_FLOOR //向负无穷方向舍入 ROUND_HALF_DOWN...//向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边...(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入” ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式 ROUND_UP...//向远离0的方向舍入
大家好,又见面了,我是你们的朋友全栈君。 在JDK版本为1.8的情况运行下面的代码,会发现很神奇的情况(见运行结果)。...向绝对值最大的方向舍入,只要舍弃位非0即进位。 2、 ROUND_DOWN:趋向零方向舍入。向绝对值最小的方向输入,所有的位都要舍弃,不存在进位情况。...Math.round()方法就是使用的此模式。 4、 ROUND_FLOOR:向负无穷方向舍入。向负无穷方向靠拢。...若是正数,舍入行为类似于ROUND_DOWN;若为负数,舍入行为类似于ROUND_UP。 5、 HALF_UP:最近数字舍入(5进)。这是我们最经典的四舍五入。...6、 HALF_DOWN:最近数字舍入(5舍)。在这里5是要舍弃的。 7、 HAIL_EVEN:银行家舍入法。
第二个参数表示小数点后保留位数 第三个参数表示舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,有下面这几种: ROUND_CEILING //向正无穷方向舍入 ROUND_DOWN //...向零方向舍入 ROUND_FLOOR //向负无穷方向舍入 ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为...1.5 ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN...ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 ROUND_UNNECESSARY //计算结果是精确的...,不需要舍入模式 ROUND_UP //向远离0的方向舍入 按照各自的需要,可传入合适的第三个参数。
setMaximumFractionDigits(int digits) digits 显示的数字位数 为格式化对象设定小数点后的显示的最多位,显示的最后位是舍入的 import java.text...BigDecimal介绍 BigDecimal是Java提供的一个不变的、任意精度的有符号十进制数对象。...向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 static int ROUND_HALF_EVEN Rounding...向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 static int ROUND_UNNECESSARY Rounding...计算结果是精确的,不需要舍入模式 static int ROUND_UP Rounding mode to round away from zero. 向远离0的方向舍入
) 计算 this / divisor 指定标度 如果需要舍入则会使用指定的模式进行舍入 应该使用 divide(BigDecimal, int, RoundingMode...()) divideToIntegralValue(BigDecimal divisor, MathContext mc) 返回 BigDecimal其值为 (this / divisor) 的整数部分准确商值的整数部分与舍入模式无关所以舍入模式不影响此方法返回的值首选标度是...-1996 中定义的核心算法(根据上下文设置进行舍入) BigDecimal abs()求绝对值其标度为 this.scale() BigDecimal abs(MathContext mc)求绝对值根据上下文设置进行舍入...) 的 BigDecimal(根据上下文设置进行舍入)。...(+this) 的 BigDecimal(根据上下文设置进行舍入)方法的效果与 round(MathContext) 方法的效果相同 BigDecimal round(MathContext mc)等同于
BigDecimal加减乘除方法 //创建 BigDecimal a = BigDecimal.valueOf(10); BigDecimal b = new BigDecimal(10); BigDecimal...c = new BigDecimal("0.1111111"); System.out.println("加法:"+a.add(b)); System.out.println("减法:"+a.subtract...(b)); System.out.println("乘法:"+a.multiply(b)); //小数点后的位数 RoundingMode.HALF_DOWN:取舍模式 System.out.println...("除法:"+a.divide(b,10, RoundingMode.HALF_DOWN)); System.out.println("设置小数点后两位:"+c.setScale(2,BigDecimal.ROUND_HALF_UP...)); 常用BigDecimal比较 BigDecimal a = new BigDecimal("10.00"); BigDecimal b = new BigDecimal("10");
领取专属 10元无门槛券
手把手带您无忧上云