📄 calculator.java
字号:
DecimalFormat df=new DecimalFormat();
df.setMaximumFractionDigits(15);
df.setDecimalSeparatorAlwaysShown(true);
if(rbAngle.isSelected()){
//角度
if((num-90)/90%2==0){
//定义域不能为-90度或90度,周期为180度
displayField.setText("函数输入无效。");
isError=true;
return;
}
num=ScienceArith.deg_to_rad(num);
double number=Math.tan(num);
displayField.setText(df.format(number));
if(displayField.getText().equals("-0.")){
displayField.setText("0.");
}
}else if(rbGrads.isSelected()){
//梯度
if((num*9/10-90)/90%2==0){
//num*9/10是将梯度转换为角度再进行定义域判断
//定义域不能为-90度或90度,周期为180度
displayField.setText("函数输入无效。");
isError=true;
return;
}
num=ScienceArith.grad_to_rad(num);
double number=Math.tan(num);
displayField.setText(df.format(number));
if(displayField.getText().equals("-0.")){
displayField.setText("0.");
}
}else{
//弧度
if((num-(Math.PI/2))/(Math.PI/2)%2==0){
//判断num是不是pi/2的奇数倍
//定义域不能为-90度或90度,周期为180度
displayField.setText("函数输入无效。");
isError=true;
return;
}
double number=Math.tan(num);
displayField.setText(df.format(number));
if(displayField.getText().equals("-0.")){
displayField.setText("0.");
}
}
}
isOperandBegin=true;
isDot=false;
}
});
//创建LBracket按钮
btnLBracket=new JButton("(");
btnLBracket.setForeground(Color.MAGENTA);
btnLBracket.setMargin(new Insets(0,1,2,1));
container.add(btnLBracket);
btnLBracket.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(isError){
return;
}
setOperatorForScience(e);
}
});
//创建RBracket
btnRBracket=new JButton(")");
btnRBracket.setForeground(Color.MAGENTA);
btnRBracket.setMargin(new Insets(0,1,2,1));
container.add(btnRBracket);
btnRBracket.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(isError){
return;
}
setOperatorForScience(e);
}
});
//创建Exp按钮
btnExp=new JButton("Exp");
btnExp.setForeground(Color.MAGENTA);
btnExp.setMargin(new Insets(0,1,2,1));
container.add(btnExp);
btnExp.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError==true||canExp==false){
return;
}
String displayStr=displayField.getText();
displayStr=displayStr.replace(",","");
if(displayStr.indexOf("E+")==-1){
displayField.setText(displayField.getText()+"E+0");
}
isExp=true;
}
});
//创建XPowY按钮
btnXPowY=new JButton("x^y");
btnXPowY.setForeground(Color.MAGENTA);
btnXPowY.setMargin(new Insets(0,1,2,1));
container.add(btnXPowY);
btnXPowY.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
if(isError){
return;
}
setOperatorForScience(e);
}
});
//创建XPow3按钮
btnXPow3=new JButton("x^3");
btnXPow3.setForeground(Color.MAGENTA);
btnXPow3.setMargin(new Insets(0,1,2,1));
container.add(btnXPow3);
btnXPow3.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError){
return;
}
String str=displayField.getText();
str=str.replace(",","");
double num=Double.parseDouble(str);
if(cbInv.isSelected()){
try{
if(num>=0){
decimalismFormat.setMaximumFractionDigits(30);
displayField.setText(decimalismFormat.format(Math.cbrt(num)));
}
else{
displayField.setText("函数输入无效。");
isError=true;
}
}
catch(NumberFormatException nfe){
}
cbInv.setSelected(false);
return;
}
try{
DecimalFormat df=new DecimalFormat();
df.setDecimalSeparatorAlwaysShown(true);
df.setMaximumFractionDigits(30);
df.setMaximumIntegerDigits(32);
BigDecimal bd=Arith.xpow3(str);
int scalNeg=1;
if(bd.toString().indexOf("E")!=-1){
scalNeg=Integer.parseInt(bd.toString().substring(bd.toString().indexOf("E")+1,bd.toString().length()));
}
if(bd.toString().length()>=32||scalNeg<=0){
df.applyPattern("0.##############################E0");
String tempstr=df.format(bd);
int scale=Integer.parseInt(tempstr.substring(tempstr.indexOf("E")+1,tempstr.length()));
if(scale>=32||scale<=-31||scalNeg<-31){
displayField.setText(tempstr);
}
else{
displayField.setText(bd.toString());
}
}
else{
displayField.setText(decimalismFormat.format(bd));
}
}
catch (Exception e) {
JOptionPane.showMessageDialog(null,"对不起,数值过大!计算停止!","提示",JOptionPane.ERROR_MESSAGE);
}
isOperandBegin=true;
isDot=false;
}
});
//创建XPow2按钮
btnXPow2=new JButton("x^2");
btnXPow2.setForeground(Color.MAGENTA);
btnXPow2.setMargin(new Insets(0,1,2,1));
container.add(btnXPow2);
btnXPow2.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError){
return;
}
String str=displayField.getText();
str=str.replace(",","");
double num=Double.parseDouble(str);
if(cbInv.isSelected()){
try{
if(num>=0){
decimalismFormat.setMaximumFractionDigits(30);
displayField.setText(decimalismFormat.format(Math.sqrt(num)));
}
else{
displayField.setText("函数输入无效。");
isError=true;
}
}
catch(NumberFormatException nfe){
}
cbInv.setSelected(false);
return;
}
try{
DecimalFormat df=new DecimalFormat();
df.setDecimalSeparatorAlwaysShown(true);
df.setMaximumFractionDigits(30);
df.setMaximumIntegerDigits(32);
BigDecimal bd=Arith.xpow2(str);
int scalNeg=1;
if(bd.toString().indexOf("E")!=-1){
scalNeg=Integer.parseInt(bd.toString().substring(bd.toString().indexOf("E")+1,bd.toString().length()));
}
if(bd.toString().length()>=32||scalNeg<=0){
df.applyPattern("0.##############################E0");
String tempstr=df.format(bd);
int scale=Integer.parseInt(tempstr.substring(tempstr.indexOf("E")+1,tempstr.length()));
if(scale>=32||scale<=-31||scalNeg<-31){
displayField.setText(tempstr);
}
else{
displayField.setText(bd.toString());
}
}
else{
displayField.setText(decimalismFormat.format(bd));
}
}
catch (Exception e) {
JOptionPane.showMessageDialog(null,"对不起,数值过大!计算停止!","提示",JOptionPane.ERROR_MESSAGE);
}
isOperandBegin=true;
isDot=false;
}
});
//创建Ln按钮
btnLn=new JButton("ln");
btnLn.setForeground(Color.MAGENTA);
btnLn.setMargin(new Insets(0,1,2,1));
container.add(btnLn);
btnLn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError){
return;
}
String tempStr=displayField.getText();
tempStr=tempStr.replace(",","");
double num=Double.parseDouble(tempStr);
if(num==0){
displayField.setText("函数输入无效。");
isError=true;
return;
}
if(cbInv.isSelected()){
displayField.setText(decimalismFormat.format(Math.pow(Math.E,num)));
cbInv.setSelected(false);
}else{
displayField.setText(decimalismFormat.format(Math.log(num)));
}
isOperandBegin=true;
isDot=false;
}
});
//创建Log按钮
btnLog=new JButton("log");
btnLog.setForeground(Color.MAGENTA);
btnLog.setMargin(new Insets(0,1,2,1));
container.add(btnLog);
btnLog.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError){
return;
}
String tempStr=displayField.getText();
tempStr=tempStr.replace(",","");
double num=Double.parseDouble(tempStr);
if(num==0){
displayField.setText("函数输入无效。");
isError=true;
return;
}
if(cbInv.isSelected()){
displayField.setText(Arith.xpowy("10",(int)num).toString());
cbInv.setSelected(false);
}else{
displayField.setText(ScienceArith.log10(num)+"");
}
isOperandBegin=true;
isDot=false;
}
});
//创建Factorial按钮
btnFactorial=new JButton("n!");
btnFactorial.setForeground(Color.MAGENTA);
btnFactorial.setMargin(new Insets(0,1,2,1));
container.add(btnFactorial);
btnFactorial.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError==true){
return;
}
String tempStr=displayField.getText();
tempStr=tempStr.replace(",","");
double num=java.lang.Double.parseDouble(tempStr);
if(num>=22222){
if(JOptionPane.CANCEL_OPTION==JOptionPane.showConfirmDialog(null,"数值过大,操作时间会比较长,是否继续?","提示",JOptionPane.OK_CANCEL_OPTION,JOptionPane.WARNING_MESSAGE)){
displayField.setText("操作已取消。");
isError=true;
return;
}
}
if(num<0){
displayField.setText("函数输入无效。");
isError=true;
return;
}
BigInteger facResult=Arith.factorial(num);
if(facResult.toString().length()>31){
displayField.setText(new DecimalFormat("0.################################E0").format(facResult));
}
else{
displayField.setText(facResult.toString()+".");
}
isOperandBegin=true;
isDot=false;
}
});
//创建MC按钮
btnMC=new JButton("MC");
btnMC.setForeground(Color.RED);
btnMC.setMargin(new Insets(0,1,2,1));
container.add(btnMC);
btnMC.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError==true){
return;
}
memoryPlusResult="0.";
memoryLabel.setText("");
isOperandBegin=true;
isDot=false;
}
});
//创建MR按钮
btnMR=new JButton("MR");
btnMR.setForeground(Color.RED);
btnMR.setMargin(new Insets(0,1,2,1));
container.add(btnMR);
btnMR.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError==true){
return;
}
displayField.setText(decimalismFormat.format(new BigDecimal(memoryPlusResult)));
}
});
//创建MS按钮
btnMS=new JButton("MS");
btnMS.setForeground(Color.RED);
btnMS.setMargin(new Insets(0,1,2,1));
container.add(btnMS);
btnMS.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError==true){
return;
}
try {
String displayStr=displayField.getText();
DecimalFormat df=new DecimalFormat();
df.setParseBigDecimal(true);
df.setParseIntegerOnly(false);
Object obj=df.parse(displayStr);
double num=java.lang.Double.parseDouble(displayStr.replace(",",""));
if(num!=0){
memoryPlusResult=obj.toString();
memoryLabel.setText("M");
isOperandBegin=true;
isDot=false;
}
else{
displayField.setText("0.");
isDot=false;
isOperandBegin=true;
}
isOperandBegin=true;
isDot=false;
} catch (ParseException e) {
e.printStackTrace();
}
}
});
//创建M+按钮
btnMPlus=new JButton("M+");
btnMPlus.setForeground(Color.RED);
btnMPlus.setMargin(new Insets(0,1,2,1));
container.add(btnMPlus);
btnMPlus.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0) {
if(isError==true){
return;
}
try {
String displayStr=displayField.getText();
DecimalFormat df=new DecimalFormat();
df.setParseBigDecimal(true);
df.setParseIntegerOnly(false);
Object obj=df.parse(displayStr);
double num=java.lang.Double.parseDouble(displayStr.replace(",",""));
if(num!=0){
memoryPlusResult=Arith.add(memoryPlusResult,obj.toString()).toString();
memoryLabel.setText("M");
isOperandBegin=true;
isDot=false;
}
else{
displayField.setText("0.");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -