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 中的取近似值的方法相关推荐

  1. java中的取模_Java 中的取模和取余

    期末复习密码学时需要用到取模运算,发现 Java 中的 % 运算符并不是取模运算(Modulo Operation),而是取余运算(Complementation). 计算方法 对于整数 a,b 来说 ...

  2. 【转】Java中获取文件大小的正确方法

    [转]Java中获取文件大小的正确方法 本文出处:http://blog.csdn.net/chaijunkun/article/details/22387305,转载请注明.由于本人不定期会整理相关 ...

  3. Java中图形界面重绘方法

    ** Java中图形界面重绘方法 **   在我们编写图形界面程序的过程中,我们就会发现,当我们将窗体拉伸,缩小(或者最大化最小化)的时候,之前在窗体上画的图形会消失了. 这是为什么呢?   1)原来 ...

  4. 在Java中实现单例模式的有效方法是什么? [关闭]

    在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...

  5. java中的五种排序方法_用Java排序的五种有用方法

    java中的五种排序方法 Java排序快速概述: 正常的列表: private static List VEGETABLES = Arrays.asList("apple", &q ...

  6. java double add,Java中的DoubleStream.Builder add()方法

    add()Java中DoubleStream.Builder类的方法将元素添加到正在构建的流中.该方法返回此构建器. 语法如下default DoubleStream.Builder add(doub ...

  7. Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

    Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...

  8. js解析java对象数组_js接收并转化Java中的数组对象的方法

    在做项目时,要向ocx控件下发命令,就要在js中得到java中的对象,然后拼成一种格式,下发下去...当对象是一个时比较简单,但如果对象是一个数组时,就略显麻烦了. 开始我以为有简单的方式,可以直接进 ...

  9. java 跨类 调用 model_Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊。...

    @JFinal 你好,想跟你请教个问题: Model.java中的这两个方法,为什么不能在子类中调用,或者包内调用也行啊. /** * Find model. */ @SuppressWarnings ...

最新文章

  1. Docker 1.13 管理命令
  2. 提供推荐——协作型过滤
  3. 2017-2018-1 20155338 《信息安全系统设计基础》 第三周学习总结
  4. 《unix设备驱动》内存分配
  5. 关于nginx配置的不完全总结
  6. 伯克利计算机科学录取率,Berkeley的CS「加州大学伯克利分校计算机科学系」
  7. 一文玩转 EhCache 缓存框架!
  8. WLC5520无法通过无线客户端进行网管故障解决
  9. 昂达v891w可以用u盘linux,想用啥用啥!昂达V891w双系统版平板评测
  10. 电脑在指定时间关机的指令代码
  11. jenkins恢复删除的文件
  12. 不是HR,Leader你会面试应聘者吗(如何起好手中的扑克牌)
  13. 网站建设的方案和流程介绍
  14. 三小时学会Kubernetes:容器编排详细指南
  15. JenKins添加Git报错Error performing git command: git ls-remote -h
  16. 万万没想到,最简单的视频编辑软件竟然是知乎?!
  17. Git合并两个分支的步骤
  18. vb如何测试连接mysql_测试是否和数据库连接成功! vbCode
  19. 想做AR/VR相关创新项目,有什么好方向?要怎么做?
  20. 分布式系统之道:Lamport 逻辑时钟

热门文章

  1. android开发笔记汇总(二)
  2. 计算机数据采集原理是什么,数据采集器工作原理是什么?
  3. MVC-《东方之星酒店管理系统》项目研发总结
  4. java单链表通讯录_[源码和文档分享]C++实现的基于链表的通讯录管理系统
  5. DCRNN:扩散卷积递归神经网络
  6. 我在京东怎么做运营——电商思维下的产品运营及管理
  7. 用 Cocos Creator 快速制作打地鼠游戏
  8. arduino(12):电子价标签管理系统,瞎折腾从网上搜索相关资料,有用的没有用的都罗列下,然后看看能不能做个电子价签系统,Electronic price tag
  9. 南信大python期末试卷_南信大 软件工程期末试卷
  10. 省级论文发表一般需要多长时间见刊