BigDecimal使用与"Non-terminating decimal expansion; no exact representable decimal result"错误解决

BigDecimal类数据的处理和"Non-terminating decimal expansion; no exact representable decimal result"问题原因很简单,因为BigDecimal高精度表示的数字是无限小数,因此会报如上错误,因此对其保留小数点后多少位即可。BigDecimal num1 = new BigDecimal("10");BigDecimal num2 = new BigDecimal("3");BigDecimal num3 = num1.divide(num2);其实devide的函数定义如下BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;scale为小数位数;roundingMode为小数模式,模式如下:ROUND_CEILING 如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。 ROUND_DOWN 从不在舍弃(即截断)的小数之前增加数字。 ROUND_FLOOR 如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。 ROUND_HALF_DOWN 若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。 ROUND_HALF_EVEN 如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。 ROUND_HALF_UP 若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。 ROUND_UNNECESSARY 该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。 ROUND_UP 总是在非 0 舍弃小数(即截断)之前增加数字。写成如下便可通过BigDecimal num3 = num1.divide(num2,10,RoundingMode.ROUND_CEILING);其他用法,这种用法适合两数相除是有限小数,无限小数仍会报以上错误BigDecimal num3 = num1.divide(num2).setScale(2, BigDecimal.ROUND_HALF_UP);参考链接:https://blog.csdn.net/roc1029/article/details/12871143

DecimalFormat的使用

double pi = Math.PI;// 整数位多则正常显示 不足则填充0 小数位多则截取 System.out.println(new DecimalFormat("0.00").format(pi)); //3.14 System.out.println(new DecimalFormat("000.00").format(pi)); //003.14// #功能同上 但对于小数结尾或整数开头的0会不予显示 System.out.println(new DecimalFormat("###.##").format(pi));//3.14// 如下小数保留2位 但3.1后0可省略 System.out.println(new DecimalFormat("###.##").format(3.100));//3.1// 0不能省略,因为小数末尾6四舍五入成了3.11 System.out.println(new DecimalFormat("###.##").format(3.106));//3.11// %号会将数值成100显示 System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%// ‰号会将数值成1000显示 System.out.println(new DecimalFormat("00.00‰").format(pi));//3141.59‰// -取负数 System.out.println(new DecimalFormat("-0.00").format(pi));//-3.14// E指数 System.out.println(new DecimalFormat("00.00E0").format(123456789012345678L));//12.35E16// #号使用在指数中直接省去整数位 System.out.println(new DecimalFormat("#E0").format(123));//.1E3 System.out.println(new DecimalFormat("0E0").format(123));//1E2// 0要在#后面 0保证了位数 System.out.println(new DecimalFormat("#####00000").format(123));//00123// ¤表示金额格式 一个¤代表一个符号 但连续的代表货币国际符号 System.out.println(new DecimalFormat(",000.00¤").format(1234567890));//1,234,567,890.00¥ System.out.println(new DecimalFormat(",000.00¤¤").format(1234567890));//1,234,567,890.00CNY// ''类似字符模板 System.out.println(new DecimalFormat("‘你好’000").format(12));//‘你好’012 System.out.println(new DecimalFormat("‘你0好’000").format(12));//‘你0012好’以上只是些简单用法,更多请

Vert.x的介绍!目前最快的Java框架?

官网:https://vertx.io/download/Vert.x是一个多语言Web框架,它支持Java,Kotlin,Scala,Ruby和Javascript支持的语言之间的共同功能。无论语言如何,Vert.x都在Java虚拟机(JVM)上运行。模块化和轻量级,它面向微服务开发。如果你开发的是一个高并发的系统,那我建议Vert.X是优先之选。Vert.X强的地方在于它的方法论。多处理器、高并发的需求,多数人都知道是要处理好同步、资源竞争、线程调度的问题。少部分人意识到异步是解决高并发的良好方案,但依然不够解决问题。只有在Akka/Actor这类方案出来之后,异步IO框架才逐渐认识到解决同步、资源竞争、线程调度的最好方法就是让它干脆不要出现。而在所有这类方案中,Vert.X是决心最大动作最彻底的。别的方案主要是基本核心等其他人扩充,Vert.X几乎是全家桶。举个例子,拿Vert.X和异步高并发界的知名前辈Nginx比较:Nginx大思路主要采用单线程模型,但是在会话秘钥等方面还是会需要内存共享。所以Nginx提供了专门的函数来处理共享内存,以及严禁复杂内存对象的共享。假如你在上面做研发,有些需求就没法实现。Vert.X则是从解决这个问题的思路就开始了重构,不是怎么去做内存共享,而是怎么让这个内存对象的访问都集中到同一线程,让内存共享的问题根本不出现。所以出现类似的情况,极少有需求用Vert.X不能实现,多半都是你没按照它的思路来理解问题。Vert.X的另外一个优点是,它没有象以前的NIO框架那样整出一套与常规编程逻辑大不相同的规范,它着力构造的是系统本身的运作方式,但尽量少干扰应用的编写。也就是说程序员需要学习的主要是解题思路,而不是解题写法。作者:海叔链接:https://www.zhihu.com/question/277219881/answer/1026585089来源:知乎