作业:简单计算器的实现
需求:完成一个简单的计算器,实现+ - * / 方法
package com.Jeremy.homework;
import java.util.Scanner;
public class calculatortest {
static double result = 0.0F;
public static void main(String[] args) {
int flag =1;
while(flag==1){
System.out.println("input equation ,eg: 5.1 - 1");
Scanner scanner = new Scanner(System.in);
//get first number
double first_num = scanner.nextDouble();
//get calculation type
char choice = scanner.next().charAt(0);//scanner输入的是string类型
//get seconde number
double second_num = scanner.nextDouble();
switch(choice){
case '+' : //case 可以直接判断char类型
result = add(first_num,second_num);
System.out.println(result);
break;
case '-' :
result = substraction(first_num,second_num);
System.out.println(result);
break;
case '*' :
result = multiplication(first_num,second_num);
System.out.println(result);
break;
case '/' :
result = division(first_num,second_num);
System.out.println(result);
break;
default:
System.out.println("the input calculation type out of range");
break;
}
System.out.println(" continue? input 1 to continue ,other to exit");
flag = scanner.nextInt();
}
}
public static double add(double i, double j, double... m){ //多个参数的运算暂未实现
for (int i1 = 0; i1 < m.length; i1++) {
result+=m[i1];
}
return i+j+result;
}
public static double substraction(double i , double j ){
result = i-j;
return result;
}
public static double multiplication(double i , double j ){
result = i*j;
return result;
}
public static double division(double i , double j ){
result = i/j;
return result;
}
}
问题总结:
1. Scanner对象
- 可以多次调用scanner对象获取键盘输入值,不需要生成多个scanner对象。
- scanner获取的对象以String类型存在。
- 获取 String 类型数据可以直接
scanne.next()
方法 - 获取 Int 、Float 、Double 类型的数据可以使用
scanne.nextInt()
、scanne.nextFloat()
、scanne.nextDouble()
- 获取 Char 类型的数据需要通过
scanne.next().CharAt(0)
方法
- 获取 String 类型数据可以直接
2. switch case 多分支判断
switch (expression)
{},其中 expression可以是一下类型- 基本数据类型:byte, short, char, int
- 包装数据类型:Byte, Short, Character, Integer
- 枚举类型:Enum
- 字符串类型:String
- case valueType: ,其中valueType可以是常量或者字面常量:
- 数值
- ‘ char ’
- “ String ”
- case后面如果不加break,会形成穿透效果。可以利用这个穿透效果,如实现设置12个月的天数,1、3、5、7、8、10、12这几个月统一用一个break。
3. 方法的未知个数参数输入
-
public static double add(double i, double j, double... m){ for (int i1 = 0; i1 < m.length; i1++) { result+=m[i1]; } return i+j+result;
4. 运算精度问题
- 计算机中float和double类型都是用二进制进行表示:
- 整数转二进制通过除2取余,从下往上排列,并总能除尽。
- 小数转二进制通过乘2取余,有的小数如0.9、0.6乘2取小数会循环下去。运算的时候取16位或者32位,就会导致精度丢失的问题。
- 解决办法: 通过
Big'Decimal
类的BigDecimal(String value)
将String型数据转换成BigDecimal
型数据,然后调用运算方法,得到的BigDeciaml
型数据通过doubleValue()
方法转换为Double 。如https://www.cnblogs.com/xujishou/p/7491932.html
5.暂未实现的功能,多个数的运算