【Java实战】DecimalFormat对数值格式化的舍入问题——RoundingMode
背景:
在对数值做一些计算的时候,往往我们需要控制计算结果的精度,所以会使用到DecimalFormat类来将数值格式化成字符串。在最近测试中,突然注意到默认使用DecimalFormat进行格式化时,并非我们一般认识上的四舍五入,而是一种诡异的舍入——(1)5以下舍去(2)5以上舍入(3)若前一位是奇数,5就舍入(4)如前一位是偶数,5就舍去
遇到这样的统计结论,没有理论的支持,我们总是感到很迷茫,所以我仔细查阅了DecimalFormat相关API,终于找到了答案。
分析:
在DecimalFormat API中有这样一段:
|
舍入
|
这句话指出了舍入模式有多种类型,而DecimalFormat默认采用了RoundingMode.HALF_EVEN这种类型,接下来,我们就一起看看,到底存在哪些舍入类型吧
RoundingMode介绍:
RoundingMode是一个枚举类,有一下几个常量:UP,DOWN,CEILING,FLOOR,HALF_UP,HALF_DOWN,HALF_EVEN,UNNECESSARY
UP
public static final RoundingMode UP
- 远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 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 static final RoundingMode DOWN
- 向零方向舍入的舍入模式。从不对舍弃部分前面的数字加 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 static final RoundingMode CEILING
- 向正无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.UP;如果结果为负,则舍入行为类似于 RoundingMode.DOWN。注意,此舍入模式始终不会减少计算值。
示例:
输入数字 使用 CEILING 舍入模式
将输入数字舍入为一位数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 static final RoundingMode FLOOR
- 向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于RoundingMode.UP。注意,此舍入模式始终不会增加计算值。
示例:
输入数字 使用 FLOOR 舍入模式
将输入数字舍入为一位数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
public static final RoundingMode HALF_UP
- 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN。注意,此舍入模式就是通常学校里讲的四舍五入。
示例:
输入数字 使用 HALF_UP 舍入模式
将输入数字舍入为一位数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 static final RoundingMode HALF_DOWN
- 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同RoundingMode.DOWN。
示例:
输入数字 使用 HALF_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 static final RoundingMode HALF_EVEN
- 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同RoundingMode.HALF_UP;如果为偶数,则舍入行为同RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对float 和double 算法使用的舍入策略。
示例:
输入数字 使用 HALF_EVEN 舍入模式
将输入数字舍入为一位数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 static final RoundingMode UNNECESSARY
- 用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。如果对生成精确结果的操作指定此舍入模式,则抛出 ArithmeticException。
示例:
输入数字 使用 UNNECESSARY 舍入模式
将输入数字舍入为一位数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
【Java实战】DecimalFormat对数值格式化的舍入问题——RoundingMode的更多相关文章
- 数值格式化 NumberFormat DecimalFormat RoundingMode
NumberFormat [简介] java.text.NumberFormat extends java.text.Format extends java.lang.Object 实现的接口:Ser ...
- 数值格式化 NumberFormat、 DecimalFormat、 RoundingMode
NumberFormat [简介] java.text.NumberFormat extends java.text.Format extends java.lang.Object 实现的接口:Ser ...
- java小数位-DecimalFormat(转)
转载:http://blog.sina.com.cn/s/blog_93daad410101159s.html java格式化数字DecimalFormat 在输出数字时,有时需要给数字配上单位,有时 ...
- Java中 DecimalFormat 用法详解
我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供DecimalFormat类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: import java.text.D ...
- HighCharts日期及数值格式化
1.函数原型 1 dateFormat(Stringformat,[Numbertime],[Booleancapitalize])::String 2.说明 格式化JavaScript 时间(也 ...
- js 数值格式化函数
function ForDight(Dight,How){ ,How))/Math.pow(,How); return Dight; } //ForDight(Dight,How):数值格式化函数; ...
- 「小程序JAVA实战」springboot的后台搭建(31)
转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootdehoutaidajian31/ 根据下面的图,我们来建立下对应的sp ...
- Java实战:教你如何进行数据库分库分表
摘要:本文通过实际案例,说明如何按日期来对订单数据进行水平分库和分表,实现数据的分布式查询和操作. 本文分享自华为云社区<数据库分库分表Java实战经验总结 丨[绽放吧!数据库]>,作者: ...
- java成神之——数值操作BigDecimal,BigInteger,Random,SecureRandom
数值操作 数值新特性 包装类 浮点 BigDecimal BigInteger 数值本地化 随机数 假随机数 真随机数 播种 结语 数值操作 数值新特性 123_456 等价于 123456,增加可读 ...
随机推荐
- 微信JS-SDK接口,分享到朋友圈”按钮点击状态及自定义分享内容接口
jssdk.php 接口文件class JSSDK { private $appId; private $appSecret; public function __construct($appId, ...
- PHP设计模式(六): 单例模式
- mysql参数及解释
key_buffer_size:(global.Dynamic)#*** MyISAM 特有的选项.即使你不使用 MyISAM 表,你仍应该将它设置为 8-64M,因为它也被用于内部的临时磁盘表.这个 ...
- 转载- ACM常见的各种说法
from : http://blog.csdn.net/qq_15015129/article/details/52738184 1.答案错误 —— wrong answer 就是最常见的.这个没办法 ...
- JavaScript高级程序设计-读书笔记(7)
第22章 高级技巧 1.高级函数 (1)安全的类型检测 在任何值上调用Object原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串. ...
- Amazon, Clear, Debian, Gentoo, Red Hat, SUSE & Ubuntu Performance On The EC2 Cloud
https://www.phoronix.com/scan.php?page=article&item=ec2-holiday-2017&num=5
- nRF5 SDK软件架构及softdevice工作原理
本文将介绍Nordic nRF5 SDK软件架构以及softdevice工作原理,以加深大家对Nordic产品开发的理解,这样开发过程中碰到问题时,大家也知道如何去调试. 如果你刚开始接触nRF5 S ...
- Nordic老版官网介绍(2018-11-30停止更新)
1. Nordic官网及资料下载 Nordic官网主页:https://www.nordicsemi.com/,进入官网后,一般点击“Products”标签页,即进入Nordic产品下载首页,其独立链 ...
- spring mvc: log4j插件 log日志的输出
准备: log插件:log4j <!-- log日志插件 --> <!-- https://mvnrepository.com/artifact/log4j/log4j --> ...
- spring mvc: 属性方法名称解析器(多动作控制器)MultiActionController/ControllerClassNameHandlerMapping/PropertiesMethodNameResolver
spring mvc: 属性方法名称解析器(多动作控制器) 加入控制器是StudentContrller.java,里面有3个方法 index,add,remove 那么访问地址是: http://l ...