亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java高精度運算問題求助

Java高精度運算問題求助

元芳怎么了 2019-03-01 10:53:25
公司項目里面需要做大量的高精度運算,剛開始用double類型運算,后來發現用double類型運算后有些值的精確度超過了理想范圍,就用了BigDecimal來計算,現在的問題是BigDecimal的運算效率比double慢幾十倍,數據量大的話,慢的要死。請問有沒有好的解決方案?這個問題急需解決。 //相關性系數計算 public BigDecimal getRelativityTool_bydim(RelativityTool u) { BigDecimal sim = new BigDecimal("0"); //最后的皮爾遜相關度系數 BigDecimal common_items_len = new BigDecimal(this.rating_map_list.size()); //操作數的個數 BigDecimal this_sum = new BigDecimal("0"); //第一個相關數的和 BigDecimal u_sum = new BigDecimal("0"); //第二個相關數的和 BigDecimal this_sum_sq = new BigDecimal("0"); //第一個相關數的平方和 BigDecimal u_sum_sq = new BigDecimal("0"); //第二個相關數的平方和 BigDecimal p_sum = new BigDecimal("0"); //兩個相關數乘積的和 for (int i = 0; i < this.rating_map_list.size(); i++) { BigDecimal this_grade = this.rating_map_list.get(i); BigDecimal u_grade = u.rating_map_list.get(i); //評分求和 //平方和 //乘積和 this_sum = this_sum.add(this_grade); u_sum = u_sum.add(u_grade); this_sum_sq = this_sum_sq.add(this_grade.pow(2)); u_sum_sq = u_sum_sq.add(u_grade.pow(2)); p_sum = p_sum.add(this_grade.multiply(u_grade)); } BigDecimal num = common_items_len.multiply(p_sum).subtract(this_sum.multiply(u_sum)); BigDecimal den = sqrt(common_items_len.multiply(this_sum_sq).subtract(this_sum.pow(2)).multiply(common_items_len.multiply(u_sum_sq).subtract(u_sum.pow(2)))); if (den.compareTo(new BigDecimal("0")) == 0) { sim = new BigDecimal("1"); } else { sim = num.divide(den,5, BigDecimal.ROUND_HALF_UP); } return sim; } //大數字開方 public static BigDecimal sqrt(BigDecimal x) { BigDecimal n1 = BigDecimal.ONE; BigDecimal ans = BigDecimal.ZERO; while ((n1.multiply(n1).subtract(x)).abs().compareTo(BigDecimal.valueOf(0.001)) == 1) { BigDecimal s1 = x.divide(n1, 2000, BigDecimal.ROUND_HALF_UP); BigDecimal s2 = n1.add(s1); n1 = s2.divide(BigDecimal.valueOf(2), 2000, BigDecimal.ROUND_HALF_UP); } ans = n1; BigDecimal rt = new BigDecimal(ans.toString().split("\\.")[0]); return rt; }
查看完整描述

3 回答

?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

除了使用C或者C++來做高精度運算之外,好像沒有什么辦法可以同時兼顧性能和精度了。

查看完整回答
反對 回復 2019-03-01
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

大學計算機專業有門課程叫“計算方法”,專門探討如何在精度有限的計算過程中保持誤差最小化。樓主有興趣的話可以找下相關教材。

查看完整回答
反對 回復 2019-03-01
  • 3 回答
  • 0 關注
  • 469 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號