使用BigDecimal并且一定要用String來夠造。
創(chuàng)新互聯(lián)公司主要從事網(wǎng)站設(shè)計、成都網(wǎng)站制作、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)澠池,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
實現(xiàn)方法如下:
import java.math.BigDecimal;
/**
* 由于Java的簡單類型不能夠精確的對浮點數(shù)進行運算,這個工具類提供精
* 確的浮點數(shù)運算,包括加減乘除和四舍五入。
*/
public class Arith{
//默認除法運算精度
private static final int DEF_DIV_SCALE = 10;
//這個類不能實例化
private Arith(){
}
/**
* 提供精確的加法運算。
* @param v1 被加數(shù)
* @param v2 加數(shù)
* @return 兩個參數(shù)的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精確的減法運算。
* @param v1 被減數(shù)
* @param v2 減數(shù)
* @return 兩個參數(shù)的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精確的乘法運算。
* @param v1 被乘數(shù)
* @param v2 乘數(shù)
* @return 兩個參數(shù)的積
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相對)精確的除法運算,當發(fā)生除不盡的情況時,精確到
* 小數(shù)點以后10位,以后的數(shù)字四舍五入。
* @param v1 被除數(shù)
* @param v2 除數(shù)
* @return 兩個參數(shù)的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相對)精確的除法運算。當發(fā)生除不盡的情況時,由scale參數(shù)指
* 定精度,以后的數(shù)字四舍五入。
* @param v1 被除數(shù)
* @param v2 除數(shù)
* @param scale 表示表示需要精確到小數(shù)點以后幾位。
* @return 兩個參數(shù)的商
*/
public static double div(double v1,double v2,int scale){
if(scale0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精確的小數(shù)位四舍五入處理。
* @param v 需要四舍五入的數(shù)字
* @param scale 小數(shù)點后保留幾位
* @return 四舍五入后的結(jié)果
*/
public static double round(double v,int scale){
if(scale0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
};
Java乘法運算還有位運算符也可以完成乘法運算
左移運算符 ,左移一位,相當于乘2
右移運算符 ,右移一位,相當于除2
22 乘 8=11 乘 16, 16是2的4次方,就是通過位運算符,11向左移4位
22 乘 8最有效的計算方法為: 11左移4位 及114
你明白了嗎?
java中dobule類型的運算方法與int和float的一樣。
代碼示例:
double s1=0.23;
dobule s2=5.2;
dobule s3=s1*s2;
相關(guān)知識:java的運算方法和運算符。
加+,減-,乘以*,除以/,取余%。java的運算方式也是遵守先乘除后加減,有括號先算括號里的運算方式。
簡易的計算器代碼如下,請參照:
import?java.awt.BorderLayout;
import?java.awt.GridLayout;
import?java.awt.event.ActionEvent;
import?java.awt.event.ActionListener;
import?java.awt.event.KeyAdapter;
import?java.awt.event.KeyEvent;
import?javax.swing.JButton;
import?javax.swing.JFrame;
import?javax.swing.JPanel;
import?javax.swing.JTextField;
/**
*?計算器類
*?
*?@author?Administrator
*
*/
public?class?Calculator?extends?JFrame?implements?ActionListener?{
private?static?final?long?serialVersionUID?=?3868243398506940702L;
//?文本框
private?JTextField?result;
//?按鈕數(shù)組
private?JButton[]?buttons;
//?按鈕文本
private?final?String[]?characters?=?{?"7",?"8",?"9",?"/",?"4",?"5",?"6",
"*",?"1",?"2",?"3",?"-",?"0",?".",?"=",?"+"?};
//?是否為第一個輸入的數(shù)字
private?boolean?isFirstDigit?=?true;
//?運算結(jié)果
private?double?resultNum?=?0.0;
//?運算符
private?String?operator?=?"=";
public?Calculator(String?title)?{
//?設(shè)置標題欄
super(title);
//?初始化各組件
init();
//?注冊各組件監(jiān)聽器
registerListener();
//?顯示窗體
setVisible(true);
}
/**
*?初始化各組件
*/
private?void?init()?{
//?常用屬性初始化
setSize(220,?200);
setResizable(false);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
/*?文本框?qū)ο蟪跏蓟?*/
result?=?new?JTextField("0");
//?文本右對齊
result.setHorizontalAlignment(JTextField.RIGHT);
//?設(shè)置是否可編輯
result.setEditable(false);
/*?按鈕初始化?*/
buttons?=?new?JButton[characters.length];
for?(int?i?=?0;?i??buttons.length;?i++)?{
buttons[i]?=?new?JButton(characters[i]);
buttons[i].setFocusable(false);?//?不允許按鈕定位焦點
}
/*?將文本框與按鈕添加到窗體中?*/
add(result,?BorderLayout.NORTH);
JPanel?pnl?=?new?JPanel(new?GridLayout(4,?4,?5,?5));
for?(JButton?jButton?:?buttons)?{
pnl.add(jButton);
}
add(pnl);
this.getContentPane().setFocusable(true);
}
/**
*?注冊監(jiān)聽器
*/
private?void?registerListener()?{
for?(JButton?jButton?:?buttons)?{
jButton.addActionListener(this);
}
//?注冊鍵盤事件
this.getContentPane().addKeyListener(new?KeyAdapter()?{
@Override
public?void?keyPressed(KeyEvent?e)?{
String?text?=?String.valueOf(e.getKeyChar());
if?(Character.isDigit(text.charAt(0))?||?".".equals(text))?{?//?數(shù)字或小數(shù)點
handleNumber(text);
}?else?if?("+-*/=".indexOf(text)?!=?-1)?{?//?運算符
handleOperator(text);
}?else?if?(e.getKeyCode()?==?8)?{?//?退格鍵
String?tmp?=?result.getText().trim();
if?(tmp.length()?==?1)?{
result.setText("0");
isFirstDigit?=?true;
}?else?{
result.setText(tmp.substring(0,?tmp.length()?-?1));
}
}
}
});
}
@Override
public?void?actionPerformed(ActionEvent?e)?{
JButton?btn?=?(JButton)?e.getSource();
String?text?=?btn.getText().trim();
if?(Character.isDigit(text.charAt(0))?||?".".equals(text))?{?//?處理數(shù)字和小數(shù)點
handleNumber(text);
}?else?{?//?處理運算符
handleOperator(text);
}
}
/**
*?處理數(shù)字和小數(shù)點
*?
*?@param?text
*/
private?void?handleNumber(String?text)?{
if?(isFirstDigit)?{?//?第一次輸入
if?(".".equals(text))?{
this.result.setText("0.");
}?else?{
this.result.setText(text);
}
}?else?if?("0".equals(text)??"0".equals(this.result.getText()))?{
isFirstDigit?=?true;
return;
}?else?if?(".".equals(text)??this.result.getText().indexOf(".")?==?-1)?{
this.result.setText(this.result.getText()?+?".");
}?else?if?(!".".equals(text))?{
this.result.setText(this.result.getText()?+?text);
}
isFirstDigit?=?false;
}
/**
*?處理運算符
*?
*?@param?text
*/
private?void?handleOperator(String?text)?{
switch?(operator)?{?//?處理各項運算??適用于JDK1.7版本的
case?"+":
resultNum?+=?Double.parseDouble(this.result.getText());
break;
case?"-":
resultNum?-=?Double.parseDouble(this.result.getText());
break;
case?"*":
resultNum?*=?Double.parseDouble(this.result.getText());
break;
case?"/":
resultNum?/=?Double.parseDouble(this.result.getText());
break;
case?"=":
resultNum?=?Double.parseDouble(this.result.getText());
break;
}
//?將文本框的值修改為運算結(jié)果
this.result.setText(String.valueOf(resultNum));
//?將點擊的運算符放入operator保存
operator?=?text;
//?下一個數(shù)字第一次點擊
isFirstDigit?=?true;
}
public?static?void?main(String[]?args)?{
?new?Calculator("My?Calculator");
?}
}
運行結(jié)果如下:
package?CMJqimo;
import?java.util.Random;
import?java.awt.*;
import?java.awt.event.ActionEvent;
import?java.awt.event.ActionListener;
import?javax.swing.*;
public?class?test?{
static?int?trueresult?=?0;
public?static?void?main(String?args[])?{
new?test();
}
public?test()?{
JPanel?jp?=?new?JPanel();
JLabel?jl?=?new?JLabel();
JTextField?jtf;
JFrame?jf?=?new?JFrame("Exam?of?Multiplication");
JButton?jb?=?new?JButton();
Container?contentPane?=?jf.getContentPane();
contentPane.add(jp);
contentPane.setLayout(new?BorderLayout());
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(300,?200);
jp.setLayout(new?FlowLayout());
jp.setBackground(Color.GREEN);
jp.setSize(1000,?1000);
int?num1?=?random_number();
int?num2?=?random_number();
trueresult?=?num1?*?num2;
JLabel?jll?=?new?JLabel(num1?+?"?x?"?+?num2?+?"?=");
jp.add(jll);
jtf?=?new?JTextField(5);
jp.add(jtf);
jb?=?new?JButton("提交");
jp.add(jb);
jl?=?new?JLabel("?");
jp.add(jl);
contentPane.add(jp);
jf.setLocation(400,?200);
jf.setVisible(true);
jb.addActionListener(new?ActionListener()?{
public?void?actionPerformed(ActionEvent?e)?{
int?input?=?Integer.valueOf(jtf.getText());
String?s?=?output_result(trueresult,?input);
JOptionPane.showMessageDialog(jp,?s);
int?a?=?random_number();
int?b?=?random_number();
trueresult?=?a?*?b;
jll.setText(a?+?"?x?"?+?b?+?"?=");
jtf.setText("");
}
});
}
public?static?int?read_input(String?s)?{
return?Integer.parseInt(s);
};
public?static?int?random_number()?{
Random?r?=?new?Random();
int?num?=?r.nextInt(10)?+?1;
return?num;
}
public?String?output_result(int?trueresult,?int?input)?{
Random?r?=?new?Random();
if?(input?==?trueresult)?{
String[]?s?=?{?"Very?good",?"Excellent",?"Great?job"?};
return?s[r.nextInt(3)];
}?else?{
return?"No,?please?try?again";
}
}
}