亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

因BigDecimal類型數據引出的問題詳析

2024-07-14 08:42:04
字體:
來源:轉載
供稿:網友

前言

我們都知道,java中對大小數,高精度的計算都會用到BigDecimal.但是在實際應用中,運用BigDecimal還是會遇到一些問題,下面話不多說了,來一起看看詳細的介紹吧

問題描述:

程序中需要判斷一個字段是否為0(字段類型為BigDecimal),想都沒想,對象的判斷用equals?結果卻與預期有一定的差距,看下面代碼及運行結果。

 public static void main(String[] args) {  BigDecimal decimal1 = BigDecimal.valueOf(0);  BigDecimal decimal2 = new BigDecimal("0.00");  System.out.println("the result is " +decimal1.equals(decimal2)); }

運行結果:

the result is false

結論: BigDecimal類型比較相等不能簡單的通過equals方法實現。

BigDecimal類的equals方法源碼如下:

 public boolean equals(Object x) {  if (!(x instanceof BigDecimal))   return false;  BigDecimal xDec = (BigDecimal) x;  if (x == this)   return true;  if (scale != xDec.scale)//這里會比較數字的精度   return false;  long s = this.intCompact;  long xs = xDec.intCompact;  if (s != INFLATED) {   if (xs == INFLATED)    xs = compactValFor(xDec.intVal);   return xs == s;  } else if (xs != INFLATED)   return xs == compactValFor(this.intVal);  return this.inflate().equals(xDec.inflate()); }

看上面的注釋可以知道,BigDecimal類的equals方法會判斷數字的精度,看下面的代碼及運行結果:

 public static void main(String[] args) {  BigDecimal decimal1 = BigDecimal.valueOf(0).setScale(2);  BigDecimal decimal2 = new BigDecimal("0.00").setScale(2);  System.out.println("the result is " +decimal1.equals(decimal2)); }

運行結果:

the result is true

結論: 使用BigDecimal類equals方法判斷兩個BigDecimal類型的數據時,需要設置精度,否則結果可能不正確。

思考:每次都設置精度比較麻煩,有其他方式進行相等的比較嗎?

看了下BigDecimal的方法列表,有一個名為compareTo的方法,通過注釋可知,貌似可以進行不同精度的比較,看下面的代碼。

 public static void main(String[] args) {  BigDecimal decimal1 = BigDecimal.valueOf(1.1);  BigDecimal decimal2 = new BigDecimal("1.10");  System.out.println("the result is " +decimal1.compareTo(decimal2)); }

運行結果:

the result is 0

0表示兩個數相等,所有可以通過compareTo實現不同精度的兩個BigDecimal類型的數字是否相等的比較

引出的問題:公司的項目中,為了避免由于精度丟失引起問題,凡是有精度要求的字段用的都是BigDecimal類型。數據持久層用的是Mybatis框架,Mybatis的mapper文件中有些條件判斷用的是BigDecimal對應的字段,如下:

<select id="selectByCondition" resultType="com.scove.demo.domain.Score"> select * from tb_score where 1=1  <if test="score!=null and score!=0">  and score>#{score} </if> ...

score是一個BigDecimal類型的字段,score!=0 Mybatis是如何進行判斷的,會不會用的是上面的equals方法?如果是那么項目上線會不會捅大簍子,想到這兒,有點怕了。寫了個程序測了下,這樣寫完全沒問題,能夠達到我想要的目的。但是還是有點擔心,看看Mybatis底層是如何實現的吧,以免以后犯類似的錯誤嘛。

經過分析調試,很快就找到了關鍵代碼的位置,如下:

public class ExpressionEvaluator { public boolean evaluateBoolean(String expression, Object parameterObject) { Object value = OgnlCache.getValue(expression, parameterObject); if (value instanceof Boolean) {  return (Boolean) value; } if (value instanceof Number) {  return !new BigDecimal(String.valueOf(value)).equals(BigDecimal.ZERO); } return value != null; }...
public final class OgnlCache {.... public static Object getValue(String expression, Object root) { try {  Map<Object, OgnlClassResolver> context = Ognl.createDefaultContext(root, new OgnlClassResolver());  return Ognl.getValue(parseExpression(expression), context, root); } catch (OgnlException e) {  throw new BuilderException("Error evaluating expression '" + expression + "'. Cause: " + e, e); } }

用的是表達式求值,Ognl這個類的竟然沒有源碼,apache的官網上找了下,是有相應的源碼的,只是需要單獨下載,真麻煩,算了不看了。據說底層用的是Spring 的ognl表達式,我也不 關心了。但是以后如果不確定mapper中的test是否正確咋個辦?

想了下,還是寫一個工具類在拿不準的時候用一下吧,反正拿不準的時候肯定很少,所以隨便寫了簡單的吧,如下:

 public static void main(String[] args) {  ExpressionEvaluator evaluator = new ExpressionEvaluator();  String expression = "score!=null and score!=0";  DynamicContext context = new DynamicContext(new Configuration(), null);  context.bind("score", BigDecimal.valueOf(0.1));  Boolean flag = evaluator.evaluateBoolean(expression , context.getBindings());  System.out.println("the result is " +flag); }

運行結果:

the result is true

總結

開發過程中,一定要細心去處理細節上的東西,不然一不小心就跳坑里了,輕則系統造成數據的不一致,修復數據;重則造成重大的損失....

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品激情av在线播放| 国产又爽又黄的激情精品视频| 精品成人av一区| 狠狠躁18三区二区一区| 奇米成人av国产一区二区三区| 国内精品小视频在线观看| 亚洲国产精品美女| 欧美另类99xxxxx| 久久久久久久久久久成人| 欧美高清在线视频观看不卡| 欧美第一黄网免费网站| 91精品国产高清久久久久久久久| 亚洲男人av电影| 亚洲va电影大全| 久久国产精品久久久| 操人视频在线观看欧美| 久久国产精品亚洲| 欧美日韩亚洲天堂| 国产精品日日做人人爱| 日韩欧美中文免费| 亚洲伦理中文字幕| 国产在线a不卡| 国产精品黄页免费高清在线观看| 一色桃子一区二区| 亚洲曰本av电影| 日韩欧美国产高清91| 亚洲大胆人体视频| 久久久久国产视频| 日韩成人性视频| 精品久久在线播放| 亚洲尤物视频网| 亚洲精品永久免费| 日韩av大片免费看| 久久在线免费观看视频| 日韩亚洲欧美中文高清在线| 国产成人涩涩涩视频在线观看| 人人做人人澡人人爽欧美| 成人久久精品视频| 亚洲欧美在线第一页| 狠狠操狠狠色综合网| 欧美性高跟鞋xxxxhd| 91精品免费视频| 亚洲欧美色图片| 亚洲香蕉av在线一区二区三区| 亚洲一区二区在线播放| 91色视频在线观看| 久久综合88中文色鬼| 国产精品视频久久久久| 92看片淫黄大片欧美看国产片| 永久免费看mv网站入口亚洲| 色悠久久久久综合先锋影音下载| 亚洲精品999| 国产精品第三页| 日韩在线视频网| 欧美亚洲成人网| 欧美一级电影免费在线观看| 欧洲成人性视频| 国产精品久久久av久久久| 成人久久18免费网站图片| 亚洲自拍欧美另类| 热久久视久久精品18亚洲精品| 91精品国产91久久久| 性亚洲最疯狂xxxx高清| 久久激情视频免费观看| 人体精品一二三区| 欧美极度另类性三渗透| 欧美激情欧美激情| 91在线高清视频| 高清欧美一区二区三区| 欧美日韩亚洲一区二| 91亚洲国产成人久久精品网站| 欧美网站在线观看| 国产日韩视频在线观看| 日韩中文在线中文网三级| 久久av在线看| 日韩中文有码在线视频| 亚洲性日韩精品一区二区| 亚洲区一区二区| 九九热精品在线| 高潮白浆女日韩av免费看| 亚洲精品视频在线观看视频| 亚洲国产三级网| 中文字幕日韩欧美精品在线观看| 亚洲va久久久噜噜噜久久天堂| 欧美电影在线观看高清| 中文字幕av一区二区| 国产在线日韩在线| 国产精品99久久久久久www| 国产视频欧美视频| 91在线观看免费高清| 久久国产天堂福利天堂| 亚洲午夜av久久乱码| 成人有码视频在线播放| 欧美日韩国产一区二区三区| 在线观看日韩www视频免费| www.久久草.com| 欧美超级乱淫片喷水| 日韩人体视频一二区| 国产精品美女久久久久av超清| 国产精品日日做人人爱| 国产精品偷伦视频免费观看国产| 久久国产色av| 久久韩剧网电视剧| 国内精品久久久久久| 久久久91精品国产一区不卡| 91免费高清视频| 68精品久久久久久欧美| 91亚洲一区精品| 97久久精品人搡人人玩| 韩国v欧美v日本v亚洲| 欧美情侣性视频| 亚洲精品一区二区三区不| 亚洲成人av在线播放| 精品香蕉一区二区三区| 久久精品亚洲一区| www.欧美三级电影.com| 韩国福利视频一区| 欧美制服第一页| 国产玖玖精品视频| 精品久久久久久国产91| 亚洲欧美另类在线观看| 97高清免费视频| 裸体女人亚洲精品一区| 久久久久国产精品免费网站| 欧美成人小视频| 91色在线视频| 欧美黑人一区二区三区| 久久99久国产精品黄毛片入口| 成人免费视频在线观看超级碰| 欧美成人免费在线视频| 国产精品免费视频久久久| 国产日韩欧美视频| 亚洲国产精品专区久久| 日本高清视频一区| 亚洲成人性视频| 亚洲自拍小视频免费观看| 操日韩av在线电影| 亚洲成人av资源网| 欧美最猛性xxxxx免费| 中文字幕精品—区二区| 亚洲综合成人婷婷小说| 亚洲欧美日本另类| 欧美精品久久久久a| 最近2019中文字幕在线高清| 亚洲男人的天堂在线| 97人洗澡人人免费公开视频碰碰碰| 欧美乱妇高清无乱码| 欧美成人免费视频| 日韩av高清不卡| 亚洲人免费视频| 2019中文在线观看| 26uuu另类亚洲欧美日本一| 国产成人97精品免费看片| 精品福利一区二区| 亚洲精品98久久久久久中文字幕| 成人午夜高潮视频| 中文字幕精品在线视频| 国产免费观看久久黄| 亚洲高清一二三区| 在线看日韩欧美| 欧美精品一区在线播放| 隔壁老王国产在线精品| 亚洲女人被黑人巨大进入al| 亚洲欧美日韩精品久久奇米色影视|