不限制长度的浮点数计算【BigDecimal】

目录

BigDecimal四则运算与取模运算

RoundingMode枚举介绍

RoundingMode舍入模式

UP

CEILING

FLOOR

HALF_UP (Half指的中点值,例如0.5、0.05,0.15等等)

HALF_DOWN

UNNECESSARY

黄金分割


BigDecimal四则运算与取模运算

package Action;import java.math.BigDecimal;public class demo {public static void main(String[] args) {BigDecimal x = new BigDecimal("2222");BigDecimal y = new BigDecimal("11111");// 加法BigDecimal add = x.add(y);System.out.println(add);// 减法BigDecimal subtract = x.subtract(y);System.out.println(subtract);// 乘法BigDecimal multiply = x.multiply(y);System.out.println(multiply);// 除法:divide(除数,保留小数位数,小数点处理方式)BigDecimal divide = x.divide(y,2,BigDecimal.ROUND_DOWN);System.out.println(divide);//除法取整BigDecimal divideToIntegralValue = x.divideToIntegralValue(y);System.out.println(divideToIntegralValue);//取模·余数BigDecimal remainder = x.remainder(y);System.out.println(remainder);}
}

RoundingMode枚举介绍

package java.math;public enum RoundingMode {UP(BigDecimal.ROUND_UP),DOWN(BigDecimal.ROUND_DOWN),CEILING(BigDecimal.ROUND_CEILING),FLOOR(BigDecimal.ROUND_FLOOR),HALF_UP(BigDecimal.ROUND_HALF_UP),HALF_DOWN(BigDecimal.ROUND_HALF_DOWN),HALF_EVEN(BigDecimal.ROUND_HALF_EVEN),UNNECESSARY(BigDecimal.ROUND_UNNECESSARY);final int oldMode;private RoundingMode(int oldMode) {this.oldMode = oldMode;}public static RoundingMode valueOf(int rm) {switch(rm) {case BigDecimal.ROUND_UP:return UP;case BigDecimal.ROUND_DOWN:return DOWN;case BigDecimal.ROUND_CEILING:return CEILING;case BigDecimal.ROUND_FLOOR:return FLOOR;case BigDecimal.ROUND_HALF_UP:return HALF_UP;case BigDecimal.ROUND_HALF_DOWN:return HALF_DOWN;case BigDecimal.ROUND_HALF_EVEN:return HALF_EVEN;case BigDecimal.ROUND_UNNECESSARY:return UNNECESSARY;default:throw new IllegalArgumentException("argument out of range");}}
}

RoundingMode是一个枚举类,有以下几个值:UP,DOWN,CEILING,FLOOR,HALF_UP,HALF_DOWN,HALF_EVEN,UNNECESSARY

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的方向舍入

RoundingMode舍入模式

UP

public final static int ROUND_UP = 0;

定义:远离零方向舍入。

解释:始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值。

图示:

示例:

输入数字 使用 UP 舍入模式将输入数字舍入为一位数
5.5 6
2.5 3
1.6 2
1.1 2
1.0 1
-1.0 -1
-1.1 -2
-1.6 -2
-2.5 -3
-5.5 -6

DOWN

public final static int ROUND_DOWN = 1;

定义:向零方向舍入。

解释:从不对舍弃部分前面的数字加 1(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值。

图示:

示例:

输入数字 使用 DOWN 舍入模式将输入数字舍入为一位数
5.5 5
2.5 2
1.6 1
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -1
-2.5 -2
-5.5 -5

CEILING

public final static int ROUND_CEILING = 2;

定义:向正无限大方向舍入。

解释:如果结果为正,则舍入行为类似于 RoundingMode.UP;如果结果为负,则舍入行为类似于RoundingMode.DOWN。注意,此舍入模式始终不会减少计算值。

图示:

示例:

输入数字 使用 DOWN 舍入模式将输入数字舍入为一位数
5.5 6
2.5 3
1.6 2
1.1 2
1.0 1
-1.0 -1
-1.1 -1
-1.6 -1
-2.5 -2
-5.5 -5

FLOOR

public final static int ROUND_FLOOR = 3;

定义:向负无限大方向舍入。

解释:如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于RoundingMode.UP。注意,此舍入模式始终不会增加计算值。

图示:

示例:

输入数字 使用 DOWN 舍入模式将输入数字舍入为一位数
5.5 5
2.5 2
1.6 1
1.1 1
1.0 1
-1.0 -1
-1.1 -2
-1.6 -2
-2.5 -3
-5.5 -6

HALF_UP (Half指的中点值,例如0.5、0.05,0.15等等)

public final static int ROUND_HALF_UP = 4;

定义:向最接近的数字方向舍入,如果与两个相邻数字的距离相等,则向上舍入。

解释:如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN。注意,此舍入模式就是通常学校里讲的四舍五入。

图示:

示例:

输入数字 使用 DOWN 舍入模式将输入数字舍入为一位数
5.5 6
2.5 3
1.6 2
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -2
-2.5 -3
-5.5 -6

HALF_DOWN

public final static int ROUND_HALF_DOWN = 5;

定义:向最接近的数字方向舍入,如果与两个相邻数字的距离相等,则向下舍入。

解释:如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN。注意,此舍入模式就是通常讲的五舍六入。

图示:

示例:

输入数字 使用 DOWN 舍入模式将输入数字舍入为一位数
5.5 5
2.5 2
1.6 2
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -2
-2.5 -2
-5.5 -5

HALF_EVEN

public final static int ROUND_HALF_EVEN = 6;

定义:向最接近数字方向舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

解释:如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,根据统计学,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对float 和double 算法使用的舍入策略。

图示:

示例:

输入数字 使用 DOWN 舍入模式将输入数字舍入为一位数
5.5 6
2.5 2
1.6 2
1.1 1
1.0 1
-1.0 -1
-1.1 -1
-1.6 -2
-2.5 -2
-5.5 -6

UNNECESSARY

public final static int ROUND_UNNECESSARY =  7;

定义:用于断言请求的操作具有精确结果,因此不发生舍入。

解释:计算结果是精确的,不需要舍入,否则抛出 ArithmeticException。

示例:

输入数字 使用 DOWN 舍入模式将输入数字舍入为一位数
5.5 抛出 ArithmeticException
2.5 抛出 ArithmeticException
1.6 抛出 ArithmeticException
1.1 抛出 ArithmeticException
1.0 1
-1.0 -1
-1.1 抛出 ArithmeticException
-1.6 抛出 ArithmeticException
-2.5 抛出 ArithmeticException
-5.5 抛出 ArithmeticException

黄金分割

黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处,
墙上的画像一般也挂在房间高度的0.618处,甚至股票的波动据说也能找到0.618的影子....
黄金分割数是个无理数,也就是无法表示为两个整数的比值。
0.618只是它的近似值,其真值可以通过对5开方减去1再除以2来获得,
我们取它的一个较精确的近似值:0.618034
有趣的是,一些简单的数列中也会包含这个无理数,这很令数学家震惊!
1 3 4 7 11 18 29 47 .... 称为“鲁卡斯队列”。它后面的每一个项都是前边两项的和。
如果观察前后两项的比值,即:1/3,3/4,4/7,7/11,11/18 ... 会发现它越来越接近于黄金分割数!
你的任务就是计算出从哪一项开始,这个比值四舍五入后已经达到了与0.618034一致的精度。
请写出该比值。格式是:分子/分母。比如:29/47

package Action;import java.math.BigDecimal;public class demo {public static double format(double d) {BigDecimal bd = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);double dd = bd.doubleValue();//返回浮点数值return dd;}public static void f(int a, int b) {double d = format((double) a / b);if (d == 0.618034) {System.out.println(a + "/" + b + "=" + d);return;}f(b, a + b);}public static void main(String[] args) {f(1, 3);}
}

到这里,不限制长度的浮点数计算就学习完了。希望能对大家邮搜帮助。欢迎一键三连。

【蓝桥杯Java_C组·从零开始卷】第五节(二)、BigDecimal的使用相关推荐

  1. 【蓝桥杯Java_C组·从零开始卷】第一节、环境与变量类型运算符与类型分析

    B站高清回放地址: [https://www.bilibili.com/video/BV1Bm4y1Q7Wt?spm_id_from=333.999.0.0] 目录 一.Java环境搭建与使用(Ecl ...

  2. 【蓝桥杯Java_C组·从零开始卷】第二节(附)、if与switch效率比较(千万次/一亿次)

    前言: 分支数 小于三时,else if 效率更高 等于三时,效率近乎相同 大于三时,switch case效率更高 if与switch小于三次对比: package Action;public cl ...

  3. 【蓝桥杯Java_C组·从零开始卷】第二节、ifswitch(超级详细,适合入门强化学习,理论与实战双保险(2021年12月30日上午9点直播·视频发布B站)

    目录 if语句的三种格式 单分支 简写语法 可能出现的异常 双分支 else if 是多分支件判断·与纯if两者区别 案例一.判断一个正整数的奇偶性 案例二.考试奖励 switch语句三种用法 swi ...

  4. 【蓝桥杯Java_C组·从零开始卷】第四节(附)、字符串常用函数

    导读 本文章将java中字符串常用的字符串进行罗列与对应demo的示例,帮助java初学者与蓝桥杯参赛的选手提升对JavaSE的理解. 目录 字符串由来 字符串转成byte数组 常用字符串函数列表: ...

  5. 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组

    整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...

  6. 【蓝桥杯Java_C组·从零开始卷】第五节(一)、BigInteger的使用

    不限制计算长度的整数运算[BigInteger] 目录 BigInteger四则运算 累加值:(从1++++到无限大) 测试数据: 结果: BigInteger取模运算 外星日历 BigInteger ...

  7. 【蓝桥杯Java_C组·从零开始卷】第四节(附)、河图洛书【九宫格】(卷王必备,不想卷的略过,使用优化暴力破解,与网上莫名其妙的规律不一样)

    目录 河图洛书到底是什么? 一,河图之象 二,河图之数 三.Java二维数组表示方法 河图洛书到底是什么? 河图与洛书是中国古代流传下来的两幅神秘图案,历来被认为是河洛文化的滥觞,中华文明的源头,被誉 ...

  8. 【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解(ArrayList、 LinkedList 和 Vector之间的区别)

    ArrayList. LinkedList 和 Vector之间的区别 ArrayList. LinkedList 和 Vector都实现了List接口,是List的三种实现,所以在用法上非常相似.他 ...

  9. 【蓝桥杯Java_C组·从零开始卷】第八节、集合——list详解

    由于咱们针对与算法使用,所有会有一些个函数可能平时用不到. 目录 list基础增 删 改 查 算法中最常用的交换 自然排序 反向排序·注不是倒序,不是倒序,不是倒序 随机排序 判断是否有某元素 集合截 ...

最新文章

  1. [UI]抽屉菜单DrawerLayout分析(二)
  2. html属性选择器怎么写,html – 具有“type”属性与make-up属性的CSS属性选择器和区分大小写...
  3. python的函数结构_Python学习(四)常见函数及控制结构
  4. 开发文件服务器,易语言开发文件服务器
  5. linux扫盲之CPU模式
  6. 做一个略调皮的个人主页--结构篇
  7. 记录几条简单的正则表达式
  8. java stream byte_乐字节-Java8新特性之Stream流(上)
  9. ROW_NUMBER() OVER的用法
  10. 硬件工程师相关书籍整理
  11. python参数估计(一个总体均值)
  12. Python 笔记_不积跬步无以至千里_一蓑烟雨任平生
  13. 80亿美元侵权诉讼的随想
  14. opencv-python——调用摄像头录制并保存视频
  15. golang个人整理知识点
  16. SPU和SKU都是什么意思
  17. ViveInputUtility-手柄拾取3D物体(7)
  18. 三大门派var,const,let之间的纠纷
  19. 【CCF CSP】【Python】【201903-1】小中大
  20. C++中两个unsigned型数值相减

热门文章

  1. 计算机网络可以把在区域上分散的单个,计算机网络技术及应用课后习题
  2. aspectj表达式如何书写_化学平衡常数的表达式书写
  3. D3js(二): d3js基础
  4. left join 后边的on条件 小记
  5. transient-java 关键字
  6. RabbitMq--2--安装
  7. 由苹果审核悲剧引发的“血案”
  8. 值得收藏的JSP连接mysql数据库的例子
  9. rwkj 1359 友元:两点距离
  10. c#中 uint--byte[]--char[]--string相互转换汇总