`

java处理高精度的商业计算

    博客分类:
  • JAVA
阅读更多
在公司写代码时,发现从mongodb中取出高精度数据时,会自动转成科学计数法!
例如数据库里存的是`0.0002`,取出来时,变成了2.0E-4.

对于这种高精度的数据,一般要用到BigDecimal类。


一般我们都是保留两位小数,但是如上例中,`0.0002`我们希望保留的有效位,是从非0位2开始
的。我们该怎么写呢?
double a = 0.0002;  
BigDecimal b = new BigDecimal(String.valueOf(a));  
BigDecimal divisor = BigDecimal.ONE;  
MathContext mc = new MathContext(2);  
System.out.println(b.divide(divisor, mc));
  • 1
  • 2
  • 3
  • 4
  • 5
上面代码的意思:用一个`BigDecimal`对象除以`divisor`后的结果,并且要求这个结果保留
有mc个小数位。其中`BigDecimal.ONE`的值就是1。(0.0002/1保留2位有效小数)
尽量使用参数类型为String的构造函数。


这里要说明下:
不要写成这样:
double a = 0.0002;  
BigDecimal b = new BigDecimal(String.valueOf(a));
BigDecimal setScale = bigDecimal.setScale(2);
System.out.println(setScale);
  • 1
  • 2
  • 3
  • 4
这样会保存会报错,因为它的保存方式不会去管,小数点后面的开始位是不是为0。假设它强行截
取得话(我们假设它不报错),就变成了0.00。就更不对啦

网上参考信息:

方法一:
scale指的是你小数点后的位数。比如123.456则score就是3.
score就是BigDecimal类中的方法啊。
你自己定义一个BigDecimal的对象调用一下就可以验证。
比如:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.

方法二:
roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,你可以看一下,有很
多种。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

`pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)`
的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有
scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的,你可
以自己选!

如果我们后台不转换的话,放到前台转也可以的。前台使用Number(),就可以把科学计数表示法
转成正式显示

参考地址

http://bbs.csdn.net/topics/360022861 
http://blog.csdn.net/jackiehff/article/details/8582449 
http://blog.csdn.net/wangxy799/article/details/51769251

分享到:
评论

相关推荐

    Java高精度计算Java高精度计算

    Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算Java高精度计算

    Java高精度计算文件

    Java高精度计算文件,很好用!!!非原创,特此向代码原作者致敬

    java高精度计算算法与分析

    关于java 中高精度计算的问题。包含加、减、乘、除等运算

    计算高精度阶乘的Java小程序

    这是偶学习Java以来设计的第一个小程序,功能构造、界面……虽不华丽,但作为处女作,还是值得分享下,欢迎大家挖掘BUG,谢谢。^_^

    java高精度计算器

    采用java.swt编写的计算器界面,corejava实现高精度计算的程序

    高精度加减计算(链表)

    运用双向链表进行高精度计算,加减,乘除在完善中。

    C++实现高精度计算类库

    C++实现高精度计算类库,包含了FFT的乘法除法,开平方,用法类似java的bigint,实测速度比java的快很多

    Java 工作日计算

    java日期计算简单实用方法如下: SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); WorkdayUtils workdayUtils = new WorkdayUtils(); workdayUtils.setLegalWorkdayList(legalWorkdayList); ...

    关于java的数值精度

    java程序中数值的精度问题,float、double容易产生精度数值问题,不适合精度计算,而bigdecimal正好解决这一问题

    Java 基本类型double精度计算工具

    该工具用户进行double类型的精度计算,包含加法、减法、乘法、除法、精确点计算、小数点计算,限制小数点后数字

    33Java大整数高精度1

    33Java大整数高精度1

    JAVA单、双行科学计算器和高精度计算器源码

    --基于JAVA的单、双行科学计算器和高精度计算器的核心源码,见src文件夹。附有示例,见src_math文件夹。不仅可以用于开发JAVA的单、双行科学计算器,还可以简化高精度算法的代码。 --同时,本计算器核心具有很强的...

    Java Double 精度问题总结

    使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000*... 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错。

    计算汉字笔画数java实现

    计算汉字笔画数,用java实现 计算汉字笔画数,用java实现

    java房贷计算工具类(商贷、公积金、组合贷)

    java版房贷计算工具类,可自定义利率,支付商贷、公积金、组合贷的计算,功能十分强大,高精度,亲测可用。

    Java基于高精度整型实现fibonacci数列的方法

    主要介绍了Java基于高精度整型实现fibonacci数列的方法,是比较典型的算法,需要的朋友可以参考下

    java 公式计算汇总,直接调用其方法即可进行运算

    将JAVA的加减乘除,正弦余弦等科学运算封装成方法,在开发需要公式计算的项目的时候,直接可以调用

    JAVA计算微积分源代码

    某天,突发奇想,有没有计算微积分的程序 找了半天,发现一些如 matlab 、《计算工厂》等软件, 就是没找到,能够以字符串形式输入表示式 并且能够方便JAVA调用的程序 于是花了3天做了一个

    java和js的计算精度的实现

    在金额的加减乘除运算时我们往往会忽略计算结果的精度问题,导致莫名奇妙出现了过多的小数位,这在我做银行项目时尤其需要关注的一个问题点。 其实在我们使用正常的 + - * / 运算时,在某些情况下就会出现精度丢失...

    浅谈Java中的高精度整数和高精度小数

    本篇文章主要介绍了浅谈Java中的高精度整数和高精度小数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Global site tag (gtag.js) - Google Analytics