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));
上面代码的意思:用一个`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);
这样会保存会报错,因为它的保存方式不会去管,小数点后面的开始位是不是为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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值