一、DecimalFormat四舍五入的坑

  1.1 有时候我们在处理小数保留几位小数时,想到了DecimalFormat这个类的使用,百度搜一把可能用到以下方式。

 1     public static void main(String[] args) {
2 String str="3.145";
3 System.out.println(round1(str));
4 }
5
6 static String round1(String str){
7 double a=Double.parseDouble(str);
8 DecimalFormat df=new DecimalFormat("###.00");
9 return df.format(a);
10 }

  1.2 初看好像没什么问题,四舍五入保留两位小数,最后输出3.15。当然精度要求不高,也无需计较。当涉及到精确统计时,这里的坑来了将上面的字符串改为“5”前面为奇数,如“3.155”,就瓜了,输出3.15。显然这里没满足要求,不是我们学校里的四舍五入。再上一段代码。

1     static String round2(String str){
2 double a=Double.parseDouble(str);
3 DecimalFormat df=new DecimalFormat("###.00");
4 df.setRoundingMode(RoundingMode.HALF_UP);
5 return df.format(a);
6 }

  这里可以看到这个setRoundingMode()方法可以设定四舍五入的模式,原来四舍五入不光有我们学校里学的那种,还有其他模式。DecimalFormat默认情况下,它使用 RoundingMode.HALF_EVEN,此舍入模式也称为“银行家舍入法”,主要在美国使用。RoundingMode.HALF_UP这个模式才是我们学校里学的标准四舍五入模式。以上代码虽然舍了学校型模式仍然不准确,应该将double类型改为BigDecimal类型。

二、学校型四舍五入几种正确使用

  2.1 String直接格式化

1     static String round3(String str){
2 double d=Double.parseDouble(str);
3 return String.format("%.2f",d);
4 }

  2.2 BigDecimal结合DecimalFormat,BigDecimal比较好性能,数据处理量大不建议使用。

1     static String round4(String str){
2 BigDecimal bigDecimal=new BigDecimal(str);
3 DecimalFormat df=new DecimalFormat("###.00");
4 df.setRoundingMode(RoundingMode.HALF_UP);
5 return df.format(bigDecimal);
6 }

  2.3 BigDecimal单独使用,这个类也自带舍入模式设定方法。

1     static String round5(String str){
2 BigDecimal bigDecimal=new BigDecimal(str);
3 return String.valueOf(bigDecimal.setScale(2,RoundingMode.HALF_UP));
4 }

Java DecimalFormat四舍五入的坑及正确用法的更多相关文章

  1. Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...

  2. 转载~kxcfzyk:Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解

    Linux C语言多线程库Pthread中条件变量的的正确用法逐步详解   多线程c语言linuxsemaphore条件变量 (本文的读者定位是了解Pthread常用多线程API和Pthread互斥锁 ...

  3. StringBuilder在高性能场景下的正确用法

    转载:<StringBuilder在高性能场景下的正确用法> by 江南白衣 关于StringBuilder,一般同学只简单记住了,字符串拼接要用StringBuilder,不要用+,也不 ...

  4. 从getApplicationContext和getApplication再次梳理Android的Application正确用法

    原文地址http://blog.csdn.net/ly502541243/article/details/52105466 原文地址http://blog.csdn.net/ly502541243/a ...

  5. Spring MVC中Session的正确用法<转>

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  6. C#中dynamic的正确用法

    C#中dynamic的正确用法  http://www.cnblogs.com/qiuweiguo/archive/2011/08/03/2125982.html dynamic是FrameWork4 ...

  7. C# string.Split对于换行符的分隔正确用法

    C# string.Split对于换行符的分隔正确用法 tmpCase "11117144-8c91-4817-9b92-99ec2f9d784a\r\n23D95A26-012C-4332 ...

  8. 【转】Spring MVC中Session的正确用法之我见

    Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性.可复用性与易集成性.优良的 ...

  9. java抽象类与接口的区别及用法

    java抽象类与接口的区别及用法 一.抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明. 二.接口是设计的结果 :抽象类是重构的结果 . 三.java不支持多重继承,所以继承抽象类只能继承一 ...

  10. C#中dynamic的正确用法 以及 typeof(DynamicSample).GetMethod("Add");

    dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性.比如,即使你 ...

随机推荐

  1. 共建共荣金融生态!金融级数字底座“源启”与GoldenDB数据库完成互认证

    近日,中电金信金融级数字底座"源启"顺利与金篆信科GoldenDB分布式数据库完成互认证.GoldenDB数据库安全稳定运行在"源启"之上,整体性能表现卓越,进 ...

  2. 【Javaweb】【Maven】Use IDEA and Maven create a Java Web Application 

    Open This Url :https://mvnrepository.com/ Search Servlet Select the latest version Copy it! Paste An ...

  3. 带宽计算-大B和小B的区别

    在计算机网络.IDC机房中,其宽带速率的单位用bps(或b/s)表示:换算关系为:1Byte=8bit 1B=8b    ---- 1B/s=8b/s(或1Bps=8bps) 1KB=1024B    ...

  4. .NET 中的线程安全数据结构

    目录 1. ConcurrentQueue 2. ConcurrentStack 3. ConcurrentBag 4. ConcurrentDictionary<TKey, TValue> ...

  5. 聊一聊 C#线程池 的线程动态注入 (下)

    一:背景 1. 讲故事 前面二篇我们聊到了 Thread.Sleep 和 Task.Result 场景下的线程注入逻辑,在线程饥饿的情况下注入速度都不是很理想,那怎么办呢?有没有更快的注入速度,这篇作 ...

  6. Qt音视频开发48-通用通道管理

    一.前言 把通用的视频控件搞定以后,后期增加新的内核方便多了,不需要在好多个文件复制粘贴之类的,接下来就是需要一个统一的类来管理视频监控系统中的16个通道或者32个通道,甚至64个通道也有可能,当然, ...

  7. springboot的yml文件中如何配置redis?

    springboot的yml文件中如何配置redis? 解决方法: spring: #redis配置 redis: database: 0 timeout: 0 # Redis服务器地址 host: ...

  8. 基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.5版已发布

    关于MobileIMSDK MobileIMSDK 是一套专门为移动端开发的开源IM即时通讯框架,超轻量级.高度提炼,一套API优雅支持UDP .TCP .WebSocket 三种协议,支持iOS.A ...

  9. git path

    github -> deepin-4090-edd25519-key openl -> deepin-4090-rsa-key gitee -> deepin-4090-dsa-ke ...

  10. Docker容器的原理、特征、基本架构、与应用场景

    什么是容器? 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发.交付和部署. 容器镜像是轻量的.可执行的独立软件包 ,包含软件运行所需的所有内容:代码.运行时环境.系统工具.系统库和设置. ...