前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[十五]java.math包简介,RoundingMode与MathContext

[十五]java.math包简介,RoundingMode与MathContext

作者头像
noteless
发布2018-12-06 17:05:17
1.7K0
发布2018-12-06 17:05:17
举报
文章被收录于专栏:notelessnoteless

java.math包提供了java中的数学类

包括基本的浮点库、复杂运算以及任意精度的数据运算

image_5bd6634a_5366
image_5bd6634a_5366

'可以看得到,主要包括三个类一个枚举

BigDecimal和BigInteger接下来会详细介绍

先说下另外两个

RoundingMode

舍入行为/ 近似模式

image_5bd6634a_227b
image_5bd6634a_227b

对于很多计算,都可能涉及到精度的问题

比如两个数进行除法, 十进制下,1/3 

结果为无限循环小数

显然计算机中不可能保存这个无限循环的小数,那么这个 0.3333333......

你到底要近似成为多少?

0?  0.5? 0.33? 1?

RoundingMode 就是这么一个存在

如同它的名字一样,近似模式

为可能丢弃精度的数值操作指定一种舍入行为

舍入模式

UP

远离零方向舍入

DOWN

向零方向舍入

image_5bd6634a_35c1
image_5bd6634a_35c1

CEILING

向正无限大方向舍入

FLOOR

向负无限大方向舍入

image_5bd6634a_53c9
image_5bd6634a_53c9

HALF_UP

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

HALF_DOWN

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

HALF_EVEN

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

HALF_UP/ HALF_DOWN /  HALF_DOWN  都是最接近数字舍入

不过如果两个相邻的数字距离相等,将会采取不同的模式

HALF_UP就是平时的四舍五入

UNNECESSARY

用于断言的舍入模式请求的操作具有精确的结果,不需要进行舍入

示例
image_5bd6634a_25d7
image_5bd6634a_25d7

拥有静态的valueOf方法,对BigDecimal中的常量,进行映射转换

返回RoundingMode对象

image_5bd6634b_40d0
image_5bd6634b_40d0

这个enum 是打算用来替代 BigDecimal中的舍入模式常量

(BigDecimal.ROUND_UP、BigDecimal.ROUND_DOWN 等)

所以后续写代码使用这个枚举

MathContext

计算上下文/数学规则

image_5bd6634b_6c63
image_5bd6634b_6c63

RoundingMode 是舍入模式的抽象描述,仅仅描述了舍入的规则

但是运算中还有一些其他的规则,比如

保留几位有效数字?

MathContext则是针对于计算的更进一步抽象

是封装上下文设置的不可变对象,它描述数字运算符的某些规则

他拥有两个属性

precision:某个操作使用的数字个数;结果舍入到此精度

roundingMode:一个 RoundingMode 对象,该对象指定舍入使用的算法

image_5bd6634b_4bf5
image_5bd6634b_4bf5

针对于这两个属性,也提供了两个方法进行获取

image_5bd6634b_364f
image_5bd6634b_364f
构造方法

MathContext(int setPrecision, RoundingMode setRoundingMode)           构造一个新的 MathContext,它具有指定的精度和舍入模式

MathContext(int setPrecision)           构造一个新的 MathContext,它具有指定的精度和 HALF_UP 舍入模式 调用上一个构造方法

MathContext(String val)           根据字符串构造一个新的 MathContext 注意:该字符串的格式必须与 toString() 方法生成的字符串的格式相同不是可以随便写的!!

equals

equals方法已经被重写,对比的是两个属性的数值是否相等

image_5bd6634b_7ac0
image_5bd6634b_7ac0
toString

注意这个格式可以用于构造对象

image_5bd6634b_fdf
image_5bd6634b_fdf
常量

我们刚才已经说明,MathContext 就是针对于运算中的一些规则进行描述的类型

对于一些规定,已经内置了几个静态对象供我们使用

static MathContext DECIMAL128 其精度设置与 IEEE 754R Decimal128 格式(即 34 个数字)匹配 舍入模式为 HALF_EVEN 这是 IEEE 754R 的默认舍入模式

static MathContext DECIMAL32 其精度设置与 IEEE 754R Decimal32 格式(即 7 个数字)匹配 舍入模式为 HALF_EVEN 这是 IEEE 754R 的默认舍入模式

static MathContext DECIMAL64 其精度设置与 IEEE 754R Decimal64 格式(即 16 个数字)匹配 舍入模式为 HALF_EVEN 这是 IEEE 754R 的默认舍入模式

static MathContext UNLIMITED 其设置具有无限精度算法所需值的 MathContext 对象

image_5bd6634b_59c9
image_5bd6634b_59c9

总结

RoundingMode  与MathContext 是针对舍入模式以及运算规则的一个抽象

RoundingMode 就是个枚举

MathContext 他在使用上也可以理解为"常量" 一样的存在

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-10-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RoundingMode
    • 舍入模式
      • 示例
      • MathContext
        • 构造方法
          • equals
            • toString
              • 常量
              • 总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档