欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何解決因BigDecimal類型數(shù)據(jù)引出的問題-創(chuàng)新互聯(lián)

這篇文章將為大家詳細(xì)講解有關(guān)如何解決因BigDecimal類型數(shù)據(jù)引出的問題,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

目前成都創(chuàng)新互聯(lián)已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、西湖網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

問題描述:

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

 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));
 }

運行結(jié)果:

the result is false

結(jié)論: BigDecimal類型比較相等不能簡單的通過equals方法實現(xiàn)。

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)//這里會比較數(shù)字的精度
   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方法會判斷數(shù)字的精度,看下面的代碼及運行結(jié)果:

 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));
 }

運行結(jié)果:

the result is true

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

思考:每次都設(shè)置精度比較麻煩,有其他方式進(jìn)行相等的比較嗎?

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

 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));
 }

運行結(jié)果:

the result is 0

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

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

<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&gt;#{score}
 </if>
 ...

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

經(jīng)過分析調(diào)試,很快就找到了關(guān)鍵代碼的位置,如下:

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);
 }
 }

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

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

 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);
 }

運行結(jié)果:

the result is true

關(guān)于“如何解決因BigDecimal類型數(shù)據(jù)引出的問題”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

網(wǎng)頁標(biāo)題:如何解決因BigDecimal類型數(shù)據(jù)引出的問題-創(chuàng)新互聯(lián)
路徑分享:http://aaarwkj.com/article10/ddcdgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站網(wǎng)站設(shè)計、網(wǎng)站維護(hù)小程序開發(fā)、網(wǎng)站排名、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
国产成人av麻豆色哟哟| 欧美高清一区二区在线播放| 日本精品专区在线观看| 国产成人国产三级国产精品| 日韩一日韩一区二区三电影在线观看| 午夜福利视频欧美成人| 人妻中出中文字幕一区二区| 国产一级黄色片免费看| 日韩精品女性三级视频| 81精品国产综合久久精品伦理| 欧美香蕉在线观看视频| 激情五月开心五月麻豆| 国产叼嘿一区二区视频| 99蜜桃臀成人美女视频| 亚洲伦理av在线观看| 精品一区二区视频在线观看网站| 国产精品毛片一区二区三| 亚洲国产熟女导航网站视频| 视频在线观看亚洲午夜福利| 97免费在线视频观看| 国产一级黄色免费大片| 亚洲天堂av成人在线观看| 日本一区二区三区播放| 亚洲综合实力最强的国家| 欧美曰韩国内精品中文| 成人福利在线观看免费视频| 射精视频在线观看免费| 久久国内午夜福利直播| 午夜日本大胆裸体艺术| 91精品国产成人在线| 日韩在线中文字幕一区| 国产强烈高潮粗暴对白| 精品一区二区三区毛卡片| 亚州欧美制服另类国产| 久久五十路六十路熟妇中出| 青青草原精品视频在线| 激情内射日本一区二区三区| 小草少妇视频免费看视频| 日韩欧美国产麻豆一区精品| 99精品亚洲一区二区| 十八禁在线观看点击进入|