阅读背景:

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(),就可以把科学计数表示法 转成正式显示 在公司写代码时,发现从mongodb中取出高精度数据时,会自动转成科学计数法! 例如数据库里存的是`


你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: