1.java中BigDecimal 的源码加减乘除和“+”“-”“*”“/”有什么区别
2.java 写的计算器源代码只实现加减乘除四则运算即可
3.Lua如何进行大数运算(附源码)
4.åç ï¼åç ï¼è¡¥ç ï¼ç§»ç
5.算术移位和逻辑移位详解
java中BigDecimal 的加减乘除和“+”“-”“*”“/”有什么区别
BigDecimal用作商业计算的。BigDecimal aDouble =new BigDecimal(1.); 输出:1.
BigDecimal aString = new BigDecimal("1."); 输出:1.
以上两者输出结果是适合不一样的。
原因:
double的乘除构造方法有不可预知性。
String的源码构造方法是固定的值。
所以如果类型是适合Double的话,而且需要精确计算,乘除源码来法就用下面方法:
Double.toString(double)方法,源码可以先转为String,适合然后再用new BigDecimal("")构造方法。乘除
注意:BigDecimal都是源码不可变的(immutable)的,在进行每一步运算时,适合都会产生一个新的乘除对象,所以在做加减乘除运算时千万要保存操作后的源码值
Demo测试
public static final void main(String[] args) {BigDecimal aBigDecimal = new BigDecimal("1.1");
BigDecimal bBigDecimal = new BigDecimal("2.0");
BigDecimal subtract = bBigDecimal.subtract(aBigDecimal);
System.out.println("使用BigDecimal进行相减计算:" + subtract.doubleValue());
System.out.println("直接相减: " + (2.0 - 1.1));
结果:
使用BigDecimal进行相减计算:0.9直接相减: 0.
java 写的计算器源代码只实现加减乘除四则运算即可
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;
public class calculator
{
String str1="0"; //运算数1 初值一定为0 为了程序的安全
String str2="0"; //运算数2
String fh="+"; //运算符
String jg="";//结果
//状态开关 重要
int k1=1;//开关1 用于选择输入方向 将要写入str2或 str2
int k2=1;//开关2 符号键 次数 k2>1说明进行的是2+3-9+8 这样的多符号运算
int k3=1;//开关3 str1 是否可以被清0 ==1时可以 !=1时不能被清0
int k4=1;//开关4 str2 同上
int k5=1;//开关5 控制小数点可否被录入 ==1时可以 !=1 输入的小数点被丢掉
JButton jicunqi; //寄存器 记录 是否连续按下符号键
Vector vt=new Vector(,);
JFrame frame=new JFrame("sunshine---计算器");
JTextField jg_TextField=new JTextField(jg,);//列
JButton clear_Button=new JButton("清除");
JButton button0=new JButton("0");
JButton button1=new JButton("1");
JButton button2=new JButton("2");
JButton button3=new JButton("3");
JButton button4=new JButton("4");
JButton button5=new JButton("5");
JButton button6=new JButton("6");
JButton button7=new JButton("7");
JButton button8=new JButton("8");
JButton button9=new JButton("9");
JButton button_Dian=new JButton(".");
JButton button_jia=new JButton("+");
JButton button_jian=new JButton("-");
JButton button_cheng=new JButton("*");
JButton button_chu=new JButton("/");
JButton button_dy=new JButton("=");
public static void main(String[] args)
{
calculator calculator=new calculator();
}
calculator()
{
jg_TextField.setHorizontalAlignment(JTextField.RIGHT );//文本框 右对齐
JPanel pan=new JPanel();
pan.setLayout(new GridLayout(4,4,5,5));//四行四列 边距为5像素
pan.add(button7);
pan.add(button8);
pan.add(button9);
pan.add(button_chu);
pan.add(button4);
pan.add(button5);
pan.add(button6);
pan.add(button_cheng);
pan.add(button1);
pan.add(button2);
pan.add(button3);
pan.add(button_jian);
pan.add(button0);
pan.add(button_Dian);
pan.add(button_dy);
pan.add(button_jia);
pan.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));//pan对象的边距
JPanel pan2=new JPanel();
pan2.add(jg_TextField);
JPanel pan3=new JPanel(); //为什么要 多此一句呢? 因为我不会设置 按钮的大小
pan3.setLayout(new FlowLayout());
pan3.add(clear_Button);
//clear_Button.setSize(,);//设置清零按钮的大小 吗的 不好使 !!适合数据展示源码
frame.setLocation(,乘除 ); //主窗口 出现在位置
frame.setResizable(false); //不能调大小
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(pan2,BorderLayout.NORTH);
frame.getContentPane().add(pan,BorderLayout.CENTER);
frame.getContentPane().add(pan3,BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
//以上是 控件 和 布局
//下面是事件处理 程 序
//--------------- 数 字 键 ----------------
class JianTing implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String ss=((JButton)e.getSource()).getText();
jicunqi=(JButton)e.getSource();
vt.add(jicunqi);
if (k1==1)
{
if(k3==1)
{
str1="";
k5=1;//还原开关k5状态
}
str1=str1+ss;
//k2=1;
k3=k3+1;
//System.out.println(str1);
jg_TextField.setText(str1);//显示
}
else if(k1==2)
{
if (k4==1)
{
str2="";
k5=1; //还原开关k5状态
}
str2=str2+ss;
//k2=2;
k4=k4+1;
///////////////测试////////////////
jg_TextField.setText(str2);
}
}
}
//--------符 号-----------
class JianTing_fh implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
String ss2=((JButton)e.getSource()).getText();
jicunqi=(JButton)e.getSource();
vt.add(jicunqi);
if(k2==1)
{
k1=2;//开关 k1 为1时,向数1写 为2时,向数2写
k5=1;
fh=ss2;
k2=k2+1;//按符号键的次数
}
else
{
int a=vt.size();
JButton c=(JButton)vt.get(a-2); if(!(c.getText().equals("+"))&&!(c.getText().equals("-"))&&!(c.getText().equals("*"))&&!(c.getText().equals("/")))
{
yuns();
str1=jg;
k1=2;//开关 k1 为1时,向数1写 为2时,向数2写
k5=1;
k4=1;
fh=ss2;
} k2=k2+1;
}
}
}
//--------清除-------
class JianTing_clear implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
jicunqi=(JButton)e.getSource();
vt.add(jicunqi);
k5=1;
k2=1;
k1=1;
k3=1;
k4=1;
str1="0";
str2="0";
fh="";
jg="";
jg_TextField.setText(jg);
vt.clear();
}
}
//----------------等 于 ---------------------
class JianTing_dy implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
jicunqi=(JButton)e.getSource();
vt.add(jicunqi);
yuns();
k1=1; //还原开关k1状态
//str1=jg;
k2=1;
k3=1;//还原开关k3状态
k4=1; //还原开关k4状态
str1=jg; //为7+5= +5= 这种计算做准备
}
}
//----------------小数点 ---------------------
class JianTing_xiaos implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
jicunqi=(JButton)e.getSource();
vt.add(jicunqi);
if(k5==1)
{
String ss2=((JButton)e.getSource()).getText();
if (k1==1)
{
if(k3==1)
{
str1="";
k5=1; //还原开关k5状态
}
str1=str1+ss2;
//k2=1;
k3=k3+1;
//System.out.println(str1);
jg_TextField.setText(str1);//显示
}
else if(k1==2)
{
if (k4==1)
{
str2="";
k5=1; //还原开关k5状态
}
str2=str2+ss2;
//k2=2;
k4=k4+1;
///////////////测试////////////////
jg_TextField.setText(str2);
}
}
k5=k5+1;
}
}
//注册 监听器
JianTing_dy jt_dy=new JianTing_dy();
JianTing jt= new JianTing();//临听数字键
JianTing_fh jt_fh= new JianTing_fh();//临 听符 号键
JianTing_clear jt_c=new JianTing_clear(); //清除键
JianTing_xiaos jt_xs=new JianTing_xiaos();// 小数点 键
button7.addActionListener(jt);
button8.addActionListener(jt);
button9.addActionListener(jt);
button_chu.addActionListener(jt_fh);
button4.addActionListener(jt);
button5.addActionListener(jt);
button6.addActionListener(jt);
button_cheng.addActionListener(jt_fh);
button1.addActionListener(jt);
button2.addActionListener(jt);
button3.addActionListener(jt);
button_jian.addActionListener(jt_fh);
button0.addActionListener(jt);
button_Dian.addActionListener(jt_xs);
button_dy.addActionListener(jt_dy);
button_jia.addActionListener(jt_fh);
clear_Button.addActionListener(jt_c);
//关闭事件处理程序
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});
}
//---------------计 算------------------
public void yuns()
{
double a2,b2;//运算数1,2
String c=fh;// 运算符
double jg2=0 ;//结果
if (c.equals(""))
{
//System.out.println("请输入运算符");
jg_TextField.setText("请输入运算符");
}
else
{
System.out.println("str1:"+str1);//调试时 使 用
System.out.println("str2:"+str2);//调试时 使 用
System.out.println("运算符:"+fh);//调试时 使 用
if (str1.equals(".")) //字符串 "." 转换成double型数据时 会出错 所以手工转
str1="0.0";
if (str2.equals("."))
str2="0.0";
a2=Double.valueOf(str1).doubleValue();
b2=Double.valueOf(str2).doubleValue();
System.out.println("double型的a2:"+a2); //调试时 使 用
System.out.println("double型的b2:"+b2); //调试时 使 用
if (c.equals("+"))
{
jg2=a2+b2;
}
if (c.equals("-"))
{
jg2=a2-b2;
}
if (c.equals("*"))
{
jg2=a2*b2;
}
if (c.equals("/"))
{
if(b2==0)
{
jg2=0;// by 0 cu!
}
else
{
jg2=a2/b2;
}
}
System.out.println("double型a2"+fh+"b2结果:"+jg2);
System.out.println();
jg=((new Double(jg2)).toString());
jg_TextField.setText(jg);
}
}
}
Lua如何进行大数运算(附源码)
在游戏服务器开发中,大数计算是常见但难以避免的问题。一般数值计算在math.maxinteger范围内可直接使用Lua常规计算,超出范围则需大数计算。本文介绍了两种基于Lua的大数计算库:基于Boost的Lua库和基于GNU bc的Lua库lbc。
基于Boost的Lua库通过安装Lua、Boost和GCC,编译生成Lua直接引用的so库。编译方式有正常编译和捆绑编译。捆绑编译通过make_boost.sh脚本将boost文件复制到boost文件夹,简化编译过程。ec源码查看但需要注意,捆绑编译可能不适用于最新版本的boost。
基于GNU bc的Lua库lbc由Lua的作者之一编写,具有简单、小巧、易用等特点。编译简单,几乎只需执行make。测试结果显示,lbc在位字符的数字上,执行加减乘除各一次,其时间在1秒以下,符合要求。水仙1源码
本文还介绍了基于MAPM的Lua库lmapm,其特点与lbc类似。两种库在测试中表现稳定,但lbc提供了详细的位数信息,而lmapm采用科学计数法表示结果。
最后,本文建议根据实际需求选择合适的大数计算库。对于简单、方便、源码、可修改、可移植和精度要求较高的项目,lbc是node源码加密不错的选择。同时,还介绍了其他开源的大数计算库,供读者参考。
åç ï¼åç ï¼è¡¥ç ï¼ç§»ç
åå¨åé¢ï¼è¯¥æç« ä¸ºæ¬äººå¦ä¹ ä¸åçä¸äºç¬è®°åå¿å¾ï¼å表åºæ¥ä¸»è¦æ¯ä¸ºäºè®°å½èªå·±çå¦ä¹ è¿ç¨ãæ¬äººæçå¦æµ ï¼ç¬è®°é¾å åå¨ä¸è¶³çè³çº°æ¼ï¼ä½ä¼ä¸å®ææ´æ°ãåºæ¬ç¥è¯ï¼å设æä¸ä¸ªnä½çäºè¿å¶æ°
åè¿ä¸ªäºè¿å¶æ°å ±æ ç§ç¶æï¼è¿ä¸ªæ°æ大为
åè¿æ¥ ï¼åæäºè¿å¶ä¸º ï¼ä¸å ±æ8ä½ï¼1åé¢7个å°æ°
以ä¸ä¸¾ä¾å为nä½æ°ï¼å®ä¾ä¸º8ä½æ°
åç
ç®åç´æ¥çäºè¿å¶ï¼ä»¥ä¸ä»¥å®ç¹æ°ä¸ºä¾ã
å®ç¹çº¯å°æ°ï¼ 0 é¦ä½ä¸ºç¬¦å·ä½ï¼0为æ£1为è´ï¼è¿é表示0.1ï¼ï¼
å®ç¹çº¯æ´æ°ï¼ 0 è¿é表示1ï¼ï¼
å 为æ符å·ä½ï¼æ以ææ£è´é¶ä¹å 0 å 1
æ°æ®èå´ï¼-~ï¼åé¢7ä½å ¨ä¸º1ï¼//å ¬å¼è¡¨è¾¾ä¸º
ç¹ç¹ï¼åç ä¸éåå åï¼ä½éåä¹é¤
åç
æ£æ°çåç ä¸å ¶åç ç¸åï¼è´æ°çåç æ¯å¯¹å ¶ç¬¦å·ä½åçåç éä½ååï¼ç¬¦å·ä½ä¸åï¼ä¸º1ï¼
åç è½è¡¨è¾¾çæ°æ®èå´ï¼ä¸æºç ä¸æ ·
è¡¥ç
ç®çï¼æ¹ä¾¿è®¡ç®æºè¿è¡å å
ç¹ç¹ï¼å¨æºå¨ä¸éåå åçæ°å表示æ¹å¼
è¡¥ç è½å®ç°è®¡ç®æº"å ä¸è´æ°"çæ¬è´¨åçæ¯æ¨¡è¿ç®ï¼ä¹å°±æ¯Aåå»BçäºAå ä¸Bç¸å¯¹äºAçè¡¥æ°åæ±æ¨¡ã就好åæ¶é顺æ¶éæ¨å¨3håéæ¶éæ¨å¨9hå¾å°çç»æä¸æ ·ã
äºè¿å¶æ±è¡¥ç ï¼
è¡¥æ°=ï¼åæ°+模ï¼ï¼mod 模ï¼ï¼å¾ææ¾ï¼è¥åç æ¯æ£ï¼åè¡¥ç æ¯å®æ¬èº«ï¼å¯¹äºæ£æ°å®å ¨ä¸ç¨èèæ±è¡¥ç ã
对äºè®¡ç®æºï¼å 为两个ç¸å çæ°çä½æ°ç¸åï¼nï¼ï¼ä¸åä¸è½è¶ è¿n+1ä½ï¼å æ¤åºè¯¥åç模æ¯...ï¼n个0ï¼ã
å æ¤å¯¹äºnä½çº¯å°æ°ï¼å®ç模ï¼åè¿å¶ï¼ä¸º2 ï¼å¯¹äºnä½çº¯æ´æ°ï¼å®ç模为2 n
模 ï¼ ï¼1 0 ï¼
åç ï¼ ï¼ 0 ï¼
注æå°ï¼å°½ç®¡ç¬¦å·ä½æ²¡æä»»ä½æ°å¼ä¿¡æ¯ï¼è¿éå模ä¾ç¶æ符å·ä½èèè¿å»äºï¼åå æ¯æ们å¯ä»¥éè¿å®ä¹è¡¥ç ï¼æ¥ä½¿ç¬¬ä¸ä¸ªç¬¦å·ä½åä¸è®¡ç®æºè®¡ç®ï¼ä»èå¾å°æ³è¦çç»æã
ï¼åæ¶ï¼æ符å·ä½ç®è¿å»å¯ä»¥è®©æ们å¨ç¨æ°å¦å ¬å¼æ³æ±äºè¿å¶è¡¥æ°æ¶ï¼ç´æ¥ä»ç»æå¾å°è¡¥ç
ä¾: x= -0.
[x]è¡¥=+x=.-0.=1.
åæ¥æ¯è¦å模å¾è¡¥æ°ä¸º0.ï¼2ï¼ï¼ä½æ£å¥½é¦ä½ç1å¯ä»¥è¡¨ç¤ºåæ°çè´å·ï¼å æ¤å¯ç´æ¥è¯»åºè¡¥ç 为1
ï¼
å æ¤å¯¹äºè¡¥ç ï¼ç¬¦å·ä½æ¢èµ·æ示æ£è´å·çä½ç¨ï¼ååä¸è¿ç®ã
å¦å¤ï¼åºå«äºåç æ两个0ï¼æ£è´0ï¼ï¼å¨è¡¥ç çè§å®ä¸ï¼åªæä¸ä¸ª0ï¼...çæ£0ï¼å 为åç ä¹å ¨æ¯0ï¼ï¼è1 ...å¯ä»¥è¡¨ç¤º-1ï¼è¡¥ç 纯å°æ°ï¼æ-2 n-1 (è¡¥ç 纯æ´æ°)
//å¯ä»¥è¿ä¹è®°ï¼ä»¥çº¯æ´æ°ä¸ºä¾ï¼ï¼å 为åé¢n-1个0ååå为n-1个1ï¼å 1å为2 n-1 ()ï¼åé¢ä¸ä¸ª1表示è´æ°ï¼å æ¤è¡¥ç è½è¡¨ç¤º-2 n-1
è¡¥ç æä¹æ¥ï¼åç 为æ£ï¼è¡¥ç ä¸åç ç¸åï¼åç 为è´ï¼åé¢çä½æ°ä¸ºåç ååå 1
移ç
ç®çï¼ä¸ºäºæ¹ä¾¿è®¡ç®æºæ¯å¤§å°ï¼æ¶é¤ç¬¦å·ä½å¯¹è®¡ç®æºçå¹²æ°
åçæ¯æè´æ°é¨åå ¨é¨ç§»å°éè´æ°æ¹åï¼ä¹å°±æ¯è¯´è¦æ第ä¸ä½ç¬¦å·ä½çæä¹ç»æ¶é¤æãæ¶é¤æ¹æ³ä¸ºï¼å¯¹äºè¡¥ç çæ£æ°ï¼ç¬¦å·ä½ç±0å为1ï¼å¢å¤§ï¼å¯¹äºè¡¥ç çè´æ°ï¼ç¬¦å·ä½æ¦å¿µæ¶é¤ï¼å¨è®¡ç®æºä¸è¢«å®ä¹ä¸ºæ£æ°ï¼å为äºç¡®ä¿åè´æ°å°äºåæ£æ°ï¼ç¬¦å·ä½ç±1å为0ã
为äºä¿è¯æ¯ä¸ªæ°ä¹é´å¤§å°å ³ç³»ä¸åï¼è¦ç¨è¡¥ç æ¥è½¬æ¢æ移ç ï¼ç¨åç æ¥è½¬æ¢çè¯ï¼è´æ°ä¹é´ç大å°å ³ç³»ä¼å转ã
æ°å¦å ¬å¼ï¼
å®è§ä¸æ¥çæ¯æå± ä¸çæ´ä¸ªæ°è½´å¹³ç§»å°äºéè´åè½´ä¸ï¼æ¯ä¸ªæ°ä¹é´ç大å°å ³ç³»ä¸åã
纯å°æ°[X] 移 =1+X
纯æ´æ° [X] 移 = (ä¸è¬æ å)
移ç æä¹æ¥ï¼ç§»ç åè¡¥ç å°¾æ°ç¸åï¼ç¬¦å·ä½ç¸å(ä¹å°±æ¯è¡¥ç é¦ä½ç1->0 ;0->1ï¼
å 为移ç ä»è¡¥ç é£éæ¥ï¼æ以ä¹è½é¢å¤å¤è¡¨ç¤ºä¸ä¸ªæ°
算术移位和逻辑移位详解
大部分C编译器中,使用移位实现代码比调用乘除法子程序生成的代码效率更高。
整理Java源码时,发现一些位运算操作,移位运算的重要性得以显现。不整理不知,一整理则深感其奥妙。
移位运算,即是将数值向左或向右移动,对于十进制而言,实现放大或缩小十倍的效果;对于二进制而言,则是放大两倍或缩小两倍。
整数乘除法在C/C++中有时会犯错,因此理解移位操作至关重要。
直接移位的数据类型包括:char、short、int、long、unsigned char、unsigned short、unsigned int、unsigned long,而double、float、bool、long double则不能进行移位操作。
对于有符号数据类型,如char、short、int、long,左移时,负数的符号位始终为1,其他位左移,正数所有位左移。右移时,负数取绝对值右移,再取相反数;正数所有位右移。
无符号数据类型,如unsigned char、unsigned short、unsigned int、unsigned long,移位操作使用<< 和 >> 操作符即可。
逻辑移位操作不考虑符号位,移位结果仅为数据位的移动。左移时,低位补0,右移时,高位补0。
算术移位操作则考虑符号位。对于正数,无论左移还是右移,最高位补0。对于负数,左移时高位补1,右移时高位补1。
算术移位中,符号位会跟随整体移动,以保持符号的正确性。例如,正数左移时补0,负数左移时补1。
逻辑移位适用于所有数据类型,而算术移位则需考虑符号位,以保持数值的正确性。
java提供了三种位移运算符:<<(左移)、>>(带符号右移)和>>>(无符号右移)。
移位操作是高效计算的基础,理解其原理有助于提高编程效率。