国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

封裝MathFP和FloatBox

2019-11-18 16:12:12
字體:
來源:轉載
供稿:網友

前幾天看到mathfp的文章,很有些激動,
有了浮點數很多不能做的事情都變為可能。
但是一大堆MathFP開頭的函數和不斷的轉換讓人頭大。
于是就想著自己封裝一下,很多人都有這個想法吧:)
我的這個叫做Float。

1。首先是浮點常數,這個沒什么好說的

    public static final Float PI=new Float(MathFP.PI);
    public static final Float E=new Float(MathFP.E);
    public static final Float pi2=PI.div(2);
    public static final Float pi4=PI.div(4);
    public static final Float pi=PI.div(180);   //PI/180
    public static final Float neg1=new Float(-1);   //-1
    public static final Float pos1=new Float(1); //+1
    public static final Float ln10=new Float(10).ln_s();
    public static final Float zero=new Float(0);

2。字段和構造函數

    long v;
    public Float(Float f)
    {
        v=f.v;
    }
    public Float(String val)
    {
        v=MathFP.toFP(val);
    }
    public Float(int val)
    {
        v=MathFP.toFP(val);
    }
    PRivate Float(long val)
    {
        v=val;
    }

最后一個構造函數相當與clone的意思。

3。函數的封裝(我把基本運算也歸到里面了)
一開始我是這么做的,比如add函數:

    public Float add(Float b)
    {
        return new Float(MathFP.add(v,b.v));
    }
    public Float add(int b)
    {
        return new Float(MathFP.add(v,MathFP.toFP(b)));
    }

大家看出什么問題來了嗎?
如果要做一個x+1+2+3+4的運算,通過調用x.add(1).add(2).add(3).add(4)
將會生成4個Float對象,而其中的3個Float對象用過就扔掉了。
這使gc的負擔飚升。于是我增加了這樣一個方法:

    public Float add_s(Float b)
    {
        v=MathFP.add(v,b.v);
        return this;
    }

相當于+=的功能,于是可以調用x.add(1).add_s(2).add_s(3).add_s(4)來實現
這樣就節省了3個Float的開銷。其他的函數類推就不羅索了,下面看看FloatBox。

既然有了浮點數,我們如何輸入呢?文本框有數字模式但是不支持浮點數,
用any模式?這樣太不專業了,于是就有了FloatBox。

這就是整個實現:

package vmlinux.math;

import javax.microedition.lcdui.*;
import vmlinux.app.*;

public class FloatBox extends Canvas {

 public static final String[] Keypad=new String[]{
  "1","2","3",
  "4","5","6",
  "7","8","9",
  ".","0","+/-"
 };
 public Command Done;
 public Command Cancel;
 public Command Delete;
 StringBuffer val_;
 boolean dot_;
 Image imgKeypad_;
 char c_;
 
 public FloatBox(CommandListener o)
 {
  Cancel=new Command(StringManager.get("FloatBox.Cancel"),Command.SCREEN,3);
  Done=new Command(StringManager.get("FloatBox.Done"),Command.SCREEN,2);
  Delete=new Command(StringManager.get("FloatBox.Delete"),Command.SCREEN,1);
  this.addCommand(Cancel);
  this.addCommand(Done);
  this.addCommand(Delete);
  this.setCommandListener(o);
  val_=new StringBuffer("0");
  dot_=false;
 }
 
 protected void paint(Graphics g) {
  g.setColor(0xff,0xff,0xff);
  g.fillRect(0,0,getWidth(),getHeight());
  g.setColor(0x00,0x00,0x00);
  g.drawRect(5,5,getWidth()-10,30);
  g.setColor(0x00,0x00,0xff);
  g.drawString(val_.toString(),getWidth()-10,10,Graphics.TOPGraphics.RIGHT);
  drawKeypad(Keypad,40,g,c_);
 }
 
 void drawKeypad(String[] keys,int ytake,Graphics gx,char chr)
 {
  int xs=getWidth()/3;
  int ys=(getHeight()-ytake)/4;
  int hcenter=Graphics.TOPGraphics.HCENTER;
  if(imgKeypad_==null)
  {
   imgKeypad_=Image.createImage(getWidth(),getHeight()-ytake);
   Graphics g=imgKeypad_.getGraphics();
   int c=0;
   for(int j=0;j<4;++j)
   {
    for(int i=0;i<3;++i)
    {
     g.setColor(0xcc,0xcc,0xcc);
     g.drawRect((xs+1)*i,(ys+1)*j,xs-2,ys-2);
     if(c<keys.length)
     {
      g.setColor(0x00,0x00,0x00);
      g.drawString(keys[c++],xs*i+xs/2-2,ys*j+ys/2-8,hcenter);
     }
    }
   }
  }
  gx.drawImage(imgKeypad_,0,ytake,Graphics.TOPGraphics.LEFT);
  for(int i=0;i<keys.length;++i)
  {
   if(keys[i].indexOf(chr)>=0)
   {
    gx.setColor(0xbb,0xbb,0xbb);
    gx.fillRect((xs+1)*(i%3),(ys+1)*(i/3)+ytake,xs-2,ys-2);
    gx.setColor(0xff,0xff,0xff);
    gx.drawString(keys[i],xs*(i%3)+xs/2,ys*(i/3)+ytake+ys/2-5,hcenter);
    break;
   }
  }
 }


 protected void keyPressed(int key)
 {
  if(key==Canvas.KEY_NUM0)
  {
   if(val_.length()==0
     (val_.length()>0 && val_.charAt(0)!='0'))
    val_.append('0');
   c_='0';
  }
  else if(key>=Canvas.KEY_NUM1 && key<=Canvas.KEY_NUM9)
  {
   char c=(char)('1'+key-Canvas.KEY_NUM1);
   if(val_.length()==1 && val_.charAt(0)=='0')
   {
    val_.deleteCharAt(0);
    val_.append(c);
   }
   else
    val_.append(c);
   c_=c;
  }
  else if(key==Canvas.KEY_STAR)
  {
   if(!dot_)
   {
    val_.append('.');
    dot_=true;
   }
   c_='.';
  }
  else if(key==Canvas.KEY_POUND)
  {
   if(val_.length()>0 && val_.charAt(0)=='-')
    val_.deleteCharAt(0);
   else if(val_.length()!=1 val_.charAt(0)!='0')
    val_.insert(0,'-');
   c_='-';
  }
  else if(this.getGameAction(key)==Canvas.LEFT)
  {
   delete();
  }
  repaint();
 }

 public void delete()
 {
  if(val_.length()>0)
  {
   if(val_.charAt(val_.length()-1)=='.')
    dot_=false;
   val_.deleteCharAt(val_.length()-1);
   if(val_.length()==1 && val_.charAt(0)=='-')
    val_.deleteCharAt(0);
  }
  if(val_.length()==0)
   val_.append('0');
 }
 
 public Float getValue()
 {
  return new Float(val_.toString());
 }
 
 public void setValue(Float x)
 {
  val_.delete(0,val_.length());
  val_.append(x.toString());
 }
}

沒什么難度,不多說了。StringManager參見我的另一篇字符串管理的文章。
樣子很丑,看起來就像一個計算器。

有什么意見或建議請聯系vmlinuxx@Gmail.com,共同學習,共同進步:)

(出處:http://www.survivalescaperooms.com)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江城| 伽师县| 凤阳县| 南雄市| 隆昌县| 东乡族自治县| 奉化市| 平山县| 申扎县| 琼海市| 会宁县| 上高县| 梓潼县| 西宁市| 百色市| 金乡县| 周宁县| 隆化县| 垫江县| 文成县| 长白| 连平县| 休宁县| 夹江县| 临沧市| 营口市| 江永县| 土默特右旗| 绥阳县| 晋州市| 清水县| 威信县| 盈江县| 岳池县| 淳安县| 共和县| 凤山市| 怀远县| 纳雍县| 兴业县| 莱芜市|