前几天看到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,共同学习,共同进步:)
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器