[Java]保留数值后2位的几种方法
注:
1、以下分析基于JDK1.8.0_74。
2、实验以Double数值为例
一、返回double型
(一)Math.round
1、示例
public static void test1() {
double num = 123.465;
//double num = 123.4;
double result = Math.round(num * 100) / 100.0;
System.out.println("Math.round(),四舍五入:"+result);
System.out.println();
}
2、说明
以上代码,输出结果为:123.47。保留2位小数策略是,先将double类型扩大100倍,然后使用Math.round方法将其四舍五入为long型整数,最后除以100.0,恰好得到2位小数的double类型值。
但是通过这种方式来保留2位小数并不可靠,毕竟返回的是double类型的数值,如果原double数值小数点后少于2位,如123.4,则最终输出的结果123.4而不是123.40。
如果num = -123.465,则最终输出结果为:-123.46
3、源码分析
(1)入参float类型,返回int值
public static int round(float a) {
//……
}
水平有限,对JDK1.8之后的内部逻辑不做分析,参考1.7的源码简单描述一下。如果入参不等于最接近0.5且比0.5小的浮点数值时,把入参加上0.5后向下取整;否则,返回0。简而言之,取小于等于(参数+0.5)的最大整数。源码如下:
public static int round(float a) {
if (a != 0x1.fffffep-2f) // greatest float value less than 0.5
return (int)floor(a + 0.5f);
else
return 0;
}
(2)入参double类型,返回long值
同样,对JDK1.8之后的内部逻辑不做分析,之前版本的处理逻辑同round(float a)方法一样,只是入参为double类型,返回值为long类型。
4、延伸 ―― Math.ceil()、Math.floor()
ceil 天花板;
floor 地板。
顾名思义,一个是向上取整,一个是向下取整。
(二)BigDecimal.setScale
1、示例
public static void test2() {
double num = 123.465;
//double num = 123.4;
BigDecimal b = new BigDecimal(num);
double result = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println("BigDecimal.ROUND_HALF_UP,四舍五入:"+result);
result = b.setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue();
System.out.println("BigDecimal.ROUND_HALF_DOWN,五舍六入:"+result);
result = b.setScale(2, BigDecimal.ROUND_UP).doubleValue();
System.out.println("BigDecimal.ROUND_UP,进位处理(就是直接加1):"+result);
result = b.setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
System.out.println("BigDecimal.ROUND_DOWN,直接去掉尾数:"+result);
System.out.println();
}
2、说明
以上代码分4种策略对double浮点数进行处理,保留2位小数:
BigDecimal.ROUND_HALF_UP表示四舍五入,
BigDecimal.ROUND_HALF_DOWN也是五舍六入,
BigDecimal.ROUND_UP表示进位处理(就是直接加1),
BigDecimal.ROUND_DOWN表示直接去掉尾数。
最终返回double类型浮点数,同Math.round方法一样,不能保证输出结果绝对保留2位小数。
注意了,以上提到的ROUND_HALF_UP、ROUND_HALF_DOWN是有可能出现问题的,就比如上面的代码中num = 123.465,理论上使用ROUND_HALF_DOWN时,最终会输出123.46,而实际上输出的是123.47。百思不解,上网查询了解到,有很多童鞋在使用BigDecimal这2个枚举时都遇到过莫名的精度问题。因此,不推荐使用。
二、返回String型
(一)DecimalFormat.format
1、示例
public static void test3() {
double num = 123.465;
DecimalFormat df = new DecimalFormat("#.00");
String str = df.format(num);
System.out.println("DecimalFormat,小数部分四舍五入:"+str);
System.out.println();
}
2、说明
使用DecimalFormat. format保留2位小数,在实例化DecimalFormat时会用到‘0’和‘#’,二者的区别如下:
(1)以‘0’作为占位符组成的正则串
整数(或小数)部分的位数比数值的位数多,转换出的转换出的结果,不足的位置补0:
new DecimalFormat("0000.00").format(123.46) //转换出的结果:0123.46
new DecimalFormat("0.000").format(123.46) //转换出的结果: 123.460
new DecimalFormat("0000.000").format(123.46) //转换出的结果:0123.460
正则串整数(或小数)部分的位数比数值的位数少,转换出的转换出的结果,整数部分不改动,小数部分四舍五入:
new DecimalFormat("0.000").format(123.465) //转换出的结果:123.465
new DecimalFormat("00.00").format(123.465) //转换出的结果:123.47
new DecimalFormat("0.00").format(123.465) //转换出的结果:123.47
(2)以‘#’作为占位符组成的正则串
整数(或小数)部分的位数比数值的位数多,转换出的转换出的结果不变:
new DecimalFormat("####.##").format(123.46) //转换出的结果:123.46
new DecimalFormat("#.###").format(123.46) //转换出的结果: 123.46
new DecimalFormat("####.###").format(123.46) //转换出的结果:123.46
正则串整数(或小数)部分的位数比数值的位数少,转换出的转换出的结果,整数部分不改动,小数部分四舍五入:
new DecimalFormat("#.###").format(123.465) //转换出的结果:123.465
new DecimalFormat("##.##").format(123.465) //转换出的结果:123.47
new DecimalFormat("#.##").format(123.465) //转换出的结果:123.47
(二)String.format
1、示例
public static void test4() {
double num = 123.465;
String format = String.format("%.2f", num);
System.out.println("String.format,保留后两位,能四舍五入:"+format);
System.out.println();
}
2、说明
字符串格式化方法 format(),按照JDK中的解释:使用指定的格式字符串和参数返回格式化的字符串。
其用的占位符如下:
字母 |
适用参数类型 |
说明 |
%a |
浮点数 |
以16进制输出浮点数 |
%b / %B |
任意值 |
如果参数为 |
%c / %C |
字符或整数 |
输出对应的 Unicode 字符 |
%d |
整数 |
对整数进行格式化输出 |
%e / %E |
浮点数 |
以科学记数法输出浮点数 |
%f |
浮点数 |
对浮点数进行格式化输出 |
%g / %G |
浮点数 |
以条件来决定是否以科学记数法方式输出浮点数 |
%h / %H |
任意值 |
以 16 进制输出参数的 |
%o |
整数 |
以8进制输出整数 |
%s / %S |
字符串 |
对字符串进行格式化输出 |
%t |
日期时间 |
对日期时间进行格式化输出 |
%x / %X |
整数 |
以16进制输出整数 |
%n |
无 |
换行符 |
%% |
无 |
百分号本身 |
需要注意的是,以上占位符如果是用的大写,转换出来的字母都是大写;如果是小写,则转换出来是原字符串。
3、常用示例
(1)显示部分字符
String.format("%.5s", "Hello, world"); // 输出 "Hello"
String.format("%.5s...", "Hello, world"); // 输出 "Hello..."
(2)输出逗号分隔数字
String.format("%,d", 1234567); // 输出 "1,234,567"
(3)逗号分隔+小数点后2位浮点数
String.format("%,.2f", 1234567.8989); // 输出 "1,234,567.90"
(4)向左补齐 0 并对齐(仅对数字有效)
String.format("%08d", 123); // 输出 "00000123"
(三)NumberFormat. setMaximumFractionDigits
1、示例
public static void test5() {
double num = 123.465;
NumberFormat nf = NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setRoundingMode(RoundingMode.UP);
System.out.println("RoundingMode.UP,进位处理(就是直接加1),负数先取绝对值进位处理再负数:"+nf.format(num));
nf.setRoundingMode(RoundingMode.HALF_UP);
System.out.println("RoundingMode.HALF_UP,四舍五入,负数先取绝对值再四舍五入再负数:"+nf.format(num));
nf.setRoundingMode(RoundingMode.DOWN);
System.out.println("RoundingMode.DOWN,直接去掉尾数,负数先取绝对值再五舍六入再负数:"+nf.format(num));
nf.setRoundingMode(RoundingMode.HALF_DOWN);
System.out.println("RoundingMode.HALF_DOWN,五舍六入,负数先取绝对值再五舍六入再负数:"+nf.format(num));
}
2、说明
RoundingMode.UP:表示进位处理(就是直接加1),负数先取绝对值进位处理再负数
RoundingMode.HALF_UP:表示四舍五入,负数先取绝对值再五舍六入再负数
RoundingMode.DOWN:表示直接去掉尾数,负数先取绝对值去掉尾数再负数
RoundingMode.HALF_DOWN表示五舍六入,负数先取绝对值再五舍六入再负数
在经过上述试验后证明,使用RoundingMode.HALF_DOWN并没有五舍六入而是四舍五入,文档说明和实际处理结果不一致,这点也许和BigDecimal. ROUND_HALF_DOWN一样也是JDK本身的bug,因此不深研,不推荐使用。
[Java]保留数值后2位的几种方法相关推荐
- 在oracle里面保留小数点后两位,Oracle保留小数点后两位的几种方法
有时候在做数据处理的时候,在前台页面上显示的数字需要保留小数点的后两位,不足两位的用0代替,这个时候就需要对数据做一些处理了.如果只用round(value,2)(四舍五入)和trunc(value, ...
- double类型保留小数点后两位的几种方法
double类型保留小数点后两位的几种方法 返回double类型 返回double类型需要注意的是:如果结果为2020.10时,输出的值为2020.1,只保留了一位小数. //四舍五入double o ...
- java小数点后两位 四舍五入_Java中double函数,四舍五入并保留小数点后两位的4种方法,BMI案例...
今天写了一个小程序,Java 语言的测试BMI[谁不知道"BMI"的自行百度不解释],涉及到了四舍五入并保留小数点后两位,就总结了一下.先给大家看看程序 就是说给大家提供4种方法来 ...
- java除法保留两位小数_JAVA除法保留小数点后两位的两种方法
1.利用Math.round()的方法: 两个int型的数相除,结果保留小数点后两位: int a=1188; int b=93; double c; c=(double)(Math.round(a* ...
- php小数点后保留4wei,PHP保留小数点后两位的几种方法
代码如下: $num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $f ...
- java中取值保留小数点后两位的四种方法
方法: 用format方法,语法"String.format("%.2f",数值)" 用DecimalFormat的format方法 用setScale方法进行 ...
- php保留一位小数_php保留小数点后两位的几种方法
这个是比较基础的东西了算是,虽说不难,但是希望能对一些人有帮助吧: 1,经常用到小数点后取几位,但不能进位的情况. 比如3.149569取小数点后两位,最后两位不能四舍五入.结果:3.14. 可以使用 ...
- php 小数点后6位,PHP保留小数点后几位的三种方法
php小数点后取两位/多位的方法. 方法一.经常用到小数点后取几位,但不能进位的情况. 比如3.149569取小数点后两位,最后两位不能四舍五入.结果:3.14. 可以使用函数floor. 该函数是舍 ...
- java 格式化 浮点数_DecimalFormat的用法 Java 浮点数 Float Double 小数 格式化 保留小数位后几位等...
DecimalFormat的用法 Java 浮点数 Float Double 小数 格式化 保留小数位后几位等 DecimalFormat df = new DecimalFormat(); dou ...
最新文章
- Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)
- ICML 2020 | 基于连续动态系统学习更加灵活的位置编码
- CodeForces - 236D Let‘s Play Osu!(概率dp)
- UE4 多线程使用tip
- 如何删除集合(数组)中指定的元素
- Infragistics.NetAdvantage.WinForm.2012.v2 ComboBoxEditor的小Bug
- Widows下TortoiseGit登录密码错误
- PNG文件格式具体解释
- 简单人物画像_简易人物画像作品
- matlab 直接逆滤波,图像复原之直接逆滤波
- python如何计算成绩平方根_python 使用二分法计算平方根
- 人工智能时代,普通的我们如何提升自己的核心竞争力
- 塔防游戏c语言,塔防英雄游戏代码(原创C++实现)
- 罗生门:一个简单查询实现引发的思考
- 热风枪焊接表面贴装元件的工具和技巧
- 批量将json文件转为jpg格式
- 华为服务器网卡驱动安装文件夹,服务器网卡驱动安装
- Windows10中macOS10.14虚拟机性能优化教程
- 一个方法教你找到自己的未来发展方向
- 5.合并写(write combining)[转载]