两个数相除,怎么样才能判断出除不尽啊

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个数相除,怎么样才能判断出除不尽啊相关的知识,希望对你有一定的参考价值。

参考技术A

在除法中(/ ÷)遇到除不尽怎么办?对于数学有健忘的同学来说是痛苦的。不知道什么时候算是除不尽,在什么时候要加小数点的情况!举个例子1000000÷1411200=411200(不会加小数点的情况)1000000÷1411200=1.4112(会加小数点的情况)下面是公式画了圈的地方就是除得后会除不尽所以,要加一位零,商就是小数点

BigDecimal的常被忽略的问题

 

一:相除精度丢失的问题

  BigDecimal的api除法相对加减乘要实现的复杂多了,只介绍常用的我遇到的问题:

  问题:两数相除,如果9/3=3整除没问题,但是10/3=0.33333333......除不尽,这里不能让电脑一直除不尽,所以BigDecimal做出一些限制;

   必须按照(数,保留小数位(最大精度要限制在53位以内),舍入方式)来操作

 技术分享图片

    否则就会抛出异常,例如:

 public static void main(String[] args) {

        BigDecimal a = new BigDecimal(10);
        BigDecimal b = new BigDecimal(3);
        BigDecimal c = a.divide(b);
    }

   执行:抛出

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1616)

 

二:舍入方式精度丢失的问题

  多数相乘时,请勿先进行四舍五入或者其他的方式,以最终计算结果为基础进行取舍精度,虽然一说就明白,但是这一个编码的习惯问题,特别是在金融行业。

  舍入方式需要弄明白自己的业务才用,别为了用而随便选一个用

  1.ROUND_UP:四舍五入模式从零四舍五入。

public static void main(String[] args) {

        BigDecimal a = new BigDecimal(0.31);
        BigDecimal b = new BigDecimal(3);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_UP);
        LOGGER.error("原值:0.1033333...///"+c.toString()+"=0.2");

//结论:0-9都是向前进一位(且当0后还有小数位为前提)
}

  2.ROUND_DOWN 四舍五入模式到四舍五入接近零。

public static void main(String[] args) {
     
        BigDecimal a = new BigDecimal(0.39);
        BigDecimal b = new BigDecimal(1);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_DOWN);
        LOGGER.error("原值:0.39///"+c.toString()+"=0.3");
      //结论:1-9都是向前进一位 }

  3.ROUND_CEILING 四舍五入到正无穷。

public static void main(String[] args) {

        BigDecimal a = new BigDecimal(0.301);
        BigDecimal b = new BigDecimal(1);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_CEILING);
        LOGGER.error("原值:0.301///"+c.toString()+"=0.4");
    //结论:与第一种类似,区别就是舍入到正无穷的范围大,当值为负数时舍入失效,当用第四种解决
    }

  4.ROUND_FLOOR 四舍五入到负无穷

public static void main(String[] args) {

        BigDecimal a = new BigDecimal(-0.301);
        BigDecimal b = new BigDecimal(1);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_FLOOR);
        LOGGER.error("原值:0.301///"+c.toString()+"=0.4");
     //结论:与上面的正无穷舍入的方式相反,可以互补 }

  5.ROUND_HALF_UP 四舍五入方式四舍五入,除非两个邻边距离相等,则四舍五入。

public static void main(String[] args) {

        BigDecimal a = new BigDecimal(-0.36);
        BigDecimal b = new BigDecimal(1);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_HALF_UP);
        LOGGER.error("原值:-0.36///"+c.toString()+"=-0.4");
        //结论:正负数相同,以5为分界,<=5舍掉,>5的进1
    }

  6.ROUND_HALF_DOWN 四舍五入模式四舍五入,除非两个邻边距离相等

public static void main(String[] args) {
        BigDecimal a = new BigDecimal(-0.35);
        BigDecimal b = new BigDecimal(1);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_HALF_DOWN );
        LOGGER.error("原值:-0.35///"+c.toString()+"=-0.3");
        //结论:正负数相同,以5为分界,<=5舍掉,>5的进1
    }

  7.ROUND_HALF_EVEN 四舍五入的方式是四舍五入,除非两个邻边是等距的,在这种情况下,四舍五入对甚至邻居。

public static void main(String[] args) {
        BigDecimal a = new BigDecimal(-0.35);
        BigDecimal b = new BigDecimal(1);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_HALF_EVEN );
        LOGGER.error("原值:-0.35///"+c.toString()+"=-0.3");
        //结论:正负数相同,以5为分界,<=5舍掉,>5的进1
    }

  8.ROUND_UNNECESSARY 舍入模式,以断言所请求的操作具有精确值结果,因此不需要舍入。

public static void main(String[] args) {
        BigDecimal a = new BigDecimal(-0.36);
        BigDecimal b = new BigDecimal(1);
        BigDecimal c = a.divide(b,1,BigDecimal.ROUND_HALF_EVEN );
        LOGGER.error("原值:-0.36///"+c.toString()+"=-0.4");
        //结论:正负数相同,以5为分界,<=5舍掉,>5的进1
        // 断言中使用的,实际开发过程中最好不用
    }

 

三:BigDecimal取值范围的 validation 校验问题总结

  常常在与客户端交互时需要做很多校验,在javax.validation下面有很多不错的校验规则

  技术分享图片

  @NotNull :不为空,适用任何地方(@NotBlank只是用字符类型)

  @DecimalMax:取得最大值范围

    @DecimalMin(value = "0.00", message = "") 取值最小值






以上是关于两个数相除,怎么样才能判断出除不尽啊的主要内容,如果未能解决你的问题,请参考以下文章

java中对除不尽的数怎么处理

两数相除,当除不尽时,如果商用循环小数表示,那么要用(大于号,小于号还是等于号)

java中对除不尽的数怎么处理

两个int数据相除怎么得到double型数据

java怎么让两个数相除的商保留25位小数

c语言辗转相除法求最大公约数和最小公倍数