Java 中的取近似值的方法
BigDecimal 对round方法(近似值取法)的定义
BigDecimal 类中定义了几种近似值的取法。
ROUND_UP 总是取远离0的值。假设我们要保留2位小数,那么使用本方法,则 0.12345 => 0.13;-0.12345=>-0.13。可以看到数的绝对值(magnitude)总是变大的。
ROUND_DOWN 总是往0的方向取值。和ROUND_UP正好相反,假设我们要保留2位小数,那么使用本方法,则 0.12345 => 0.12;-0.12345=>-0.12。可以看到数的绝对值(magnitude)总是变小的。
ROUND_CEILING ceiling 是天花板的意思,因此本方法总是会对着正无穷方向取值,即沿着X轴往右取值。例如 0.12345 => 0.13;-0.12345=>-0.12。取舍后的结果总是大于原值的,无论正负都是这样。
ROUND_FLOOR floor 是底板的意思,因此本方法和 ROUND_CEILING 正好相反,总是会对着负无穷方向取值,即沿着X轴往左取值。例如 0.12345 => 0.12;-0.12345=>-0.13。取舍后的结果总是小于原值的,无论正负都是这样。
ROUND_HALF_UP HALF 是一半的意思,因此 HALF UP 就是指当值正好落在两个数之间时,向上取值,这里的 UP 同 ROUND_UP 的含义,即向正无穷取值。其他情况取离值最近的数。例如做保留2位小数的取近似值操作,那么 0.253 => 0.25,0.255 => 0.26, 0.256 => 0.26, -0.123 => -0.12, -0.125 => -0.13, -0.126 => -0.123
ROUND_HALF_DOWN 和 ROUND_HALF_UP 在 HALF 情况下相反,向负无穷取值,其他情况相同。
ROUND_EVEN 著名的银行家算法,EVEN 是偶数的意思,如 2、4、6 等。具体取法是,取最近的数,除非和两侧的数距离都相同(严格对等),那么这时看被丢弃小数左侧的一位是奇数还是偶数。
例如 0.12567 保留两位小数时,会丢弃 567 小数部分,那么被丢弃小数左侧的数字就是 2,是一个偶数。
再比如 0.13567 保留两位小数时, 会丢弃 567 小数部分,那么被丢弃小数左侧的数字就是 3,是一个奇数。对于左侧数字是奇数的情况,向正无穷取值;对于左侧数字是偶数的情况,向负无穷取值。即“奇上(UP),偶下(DOWN)”,是不是很像“七上八下”。
例如:0.123=>0.12, 0.124 => 0.12, 0.125 => 0.12, 0.135 => 0.14。因为对于 0.135 “被丢弃小数左侧的一位”是 3,是奇数,要向正无穷方向取值。
注意 0.12567 => 0.13,为什么不是 0.12 呢,567 左侧数字是 2 是一个偶数呀。原因是 0.12567 对于0.12 和0.13而言,更靠近 0.13。只有严格距离相同时才能使用“七上八下规则”,如果是对 0.125 取近似值,那么结果就应该是 0.12。
更多的HALF_EVEN例子:
0.12567近似值: 0.13
0.125近似值: 0.12
0.13567近似值: 0.14
0.135近似值: 0.14
String.format() 中的 %f 格式项(conversion)所用的取舍方法是 ROUND_HALF_UP/四舍五入
格式串的语法如下:
%[argument_index$][flags][width][.precision]conversion
当 conversion(格式项)是 f 时,Java 采取的近似值取法是 ROUND_HALF_UP 即四舍五入。
将 float 变量转换为 String 时没有使用明确的取舍方法
代码
float floatValue = 0.12345f;
String str = "value: " + floatValue;
会调用 Float.toString() 方法将 float 值转换为字符串,该方法会尽量让结果字符串接近真实值,也就是说小数的位数会非常多,不会进行截断。
参考
- String Formatter API 文档
Java 中的取近似值的方法相关推荐
- java中的取模_Java 中的取模和取余
期末复习密码学时需要用到取模运算,发现 Java 中的 % 运算符并不是取模运算(Modulo Operation),而是取余运算(Complementation). 计算方法 对于整数 a,b 来说 ...
- 【转】Java中获取文件大小的正确方法
[转]Java中获取文件大小的正确方法 本文出处:http://blog.csdn.net/chaijunkun/article/details/22387305,转载请注明.由于本人不定期会整理相关 ...
- Java中图形界面重绘方法
** Java中图形界面重绘方法 ** 在我们编写图形界面程序的过程中,我们就会发现,当我们将窗体拉伸,缩小(或者最大化最小化)的时候,之前在窗体上画的图形会消失了. 这是为什么呢? 1)原来 ...
- 在Java中实现单例模式的有效方法是什么? [关闭]
在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...
- java中的五种排序方法_用Java排序的五种有用方法
java中的五种排序方法 Java排序快速概述: 正常的列表: private static List VEGETABLES = Arrays.asList("apple", &q ...
- java double add,Java中的DoubleStream.Builder add()方法
add()Java中DoubleStream.Builder类的方法将元素添加到正在构建的流中.该方法返回此构建器. 语法如下default DoubleStream.Builder add(doub ...
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...
- js解析java对象数组_js接收并转化Java中的数组对象的方法
在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进 ...
- java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...
@JFinal 你好,想跟你请教个问题: Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊. /** * Find model. */ @SuppressWarnings ...
最新文章
- Docker 1.13 管理命令
- 提供推荐——协作型过滤
- 2017-2018-1 20155338 《信息安全系统设计基础》 第三周学习总结
- 《unix设备驱动》内存分配
- 关于nginx配置的不完全总结
- 伯克利计算机科学录取率,Berkeley的CS「加州大学伯克利分校计算机科学系」
- 一文玩转 EhCache 缓存框架!
- WLC5520无法通过无线客户端进行网管故障解决
- 昂达v891w可以用u盘linux,想用啥用啥!昂达V891w双系统版平板评测
- 电脑在指定时间关机的指令代码
- jenkins恢复删除的文件
- 不是HR,Leader你会面试应聘者吗(如何起好手中的扑克牌)
- 网站建设的方案和流程介绍
- 三小时学会Kubernetes:容器编排详细指南
- JenKins添加Git报错Error performing git command: git ls-remote -h
- 万万没想到,最简单的视频编辑软件竟然是知乎?!
- Git合并两个分支的步骤
- vb如何测试连接mysql_测试是否和数据库连接成功! vbCode
- 想做AR/VR相关创新项目,有什么好方向?要怎么做?
- 分布式系统之道:Lamport 逻辑时钟
热门文章
- android开发笔记汇总(二)
- 计算机数据采集原理是什么,数据采集器工作原理是什么?
- MVC-《东方之星酒店管理系统》项目研发总结
- java单链表通讯录_[源码和文档分享]C++实现的基于链表的通讯录管理系统
- DCRNN:扩散卷积递归神经网络
- 我在京东怎么做运营——电商思维下的产品运营及管理
- 用 Cocos Creator 快速制作打地鼠游戏
- arduino(12):电子价标签管理系统,瞎折腾从网上搜索相关资料,有用的没有用的都罗列下,然后看看能不能做个电子价签系统,Electronic price tag
- 南信大python期末试卷_南信大 软件工程期末试卷
- 省级论文发表一般需要多长时间见刊