Java 科学计数法
1 科学计数法的概念
11 有效数字
在一个近似数中,从左边第一个不是0的数字起,到精确到的位数止,这中间的所有数字都叫做这个近似数的有效数字
例如:
890314000保留三位有效数字为890×10的8次方 (四舍)
839960000保留三位有效数字为840×10的8次方 (五入)
000934593保留三位有效数字为935×10的-3次方
12 E记号
大多数计算器及计算机程序用科学记数法显示非常大和非常小的结果。因为指数上标(例如1011)在屏幕上显示不方便,字母E或e通常是用来代表的十次幂(写作“×10b”),E或e之后的数字是它的指数;换句话说,任何两实数a和b(b应为整数),“aEb”所表示的值是a × 10b。注意,这种用法中字母e不是数学常数e,也不是指数函数exp()(采用用大写字母E显示可以更大程度地避免误解);尽管它也表示指数,但这个符号通常被称为(科学计数法)E或e符号,而不是指数中的底数符号(尽管后者也会出现)。在正式的出版物中尽量不要使用这种显示方法。
注意科学记数法中的e或E与数学常数e或函数exp没有关系。
这种写法是因为一些计算机程序中不方便写上标而产生的,在正式出版物中不应当使用这种写法。
我国国家标准中科学计数法均用a ×10b的形式表示,而不是aEb(参见GB3101-1993,GBT15835-2011,GBT8170-2008)。
2 Java中的科学计数法
在Java中,当Double的取值符合某条件时,将会以科学计数法的方式显示(下面是个人测试的结果,非从文档中得到的结论):
@Testpublic void testPrintScientificNotation() { //整数部分位数大于等于8时开始以科学计数法显示
Systemoutprintln(-123456780);
Systemoutprintln(123456780); //整数位为0,当小数位以0开始连续出现大于等于3时开始以科学计数法显示
Systemoutprintln(00001);
Systemoutprintln(-00001);
}
结果
-12345678E712345678E710E-4-10E-4
很多时候,我们需要做一个统一,要么全部以科学计数法输出,要么就全部显示为普通计数。
根据网上的资料,主要提及NumberFormat、DecimalFormat、BigDecimal这三种API实现方式。
21 NumberFormat
NumberFormat 是所有数值格式的抽象基类。
public static String scientificNotation2String(Double d, int newValue) {
String value = null;
NumberFormat nf = NumberFormatgetInstance(); // 设置此格式中不使用分组
nfsetGroupingUsed(false); // 设置数的小数部分所允许的最大位数。
nfsetMaximumFractionDigits(newValue); value = nfformat(d); return value;
}
如果输入的小数位数,大于设定的最大的小数位数,则会进行四舍五入。
22 DecimalFormat
DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字。该类设计有各种功能,使其能够解析和格式化任意语言环境中的数,包括对西方语言、阿拉伯语和印度语数字的支持。它还支持不同类型的数,包括整数 (123)、定点数 (1234)、科学记数法表示的数 (123E4)、百分数 (12%) 和金额 ($123)。所有这些内容都可以本地化。
public static String scientificNotation2String(Double d) {
String value = null;
DecimalFormat decimalFormat = new DecimalFormat("000");//格式化设置
value = decimalFormatformat(d); return value;
}
需要设置模版,指定小数保留的位数,传入数值小数位数超出指定位数,则会进行四舍五入;传入数值小数位不足指定位数,则可以设置补零。
需要将数值转换为科学计数法只须将模版修改即可,例如将模版修改为:0##E0
23 BigDecimal
BigDecimal是不可变的、任意精度的有符号十进制数。
public static String scientificNotation2String(String str) {
String value = null;
BigDecimal bd = new BigDecimal(str); value = bdtoPlainString(); return value;
}
BigDecimal的构造方法很多,不一定是要传入String类型的值。
BigDecimal中的toString方法和toPlanString方法的区别:
toString():返回此BigDecimal的字符串表示形式,如果需要指数,则使用科学计数法
toPlainString():返回不带指数字段的此BigDecimal的字符传表示形式
这道题我使用的是栈来做的,如果是JDK16以上可以使用Java调用JavaScript做,这样代码量可以减少不少import javautilScanner;
import javautilStack;
public class test{
public static void TrnsInToSufix(String IFX,String []PFX)//PFX放后缀表达式,IFX为中缀表达式
{
StringBuffer numBuffer = new StringBuffer();// 用来保存一个数的
Stack<String> s=new Stack<String>();//放 *** 作符
String a;
spush("=");//第一个为等号
int i=0,j=0;
char ch;
for(i=0;i<IFXlength();)
{
ch=IFXcharAt(i);
switch(ch)
{
case '0':case '1':case '2':
case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
while(CharacterisDigit(ch)||ch=='')//拼数
{
numBufferappend(ch); // 追加字符
ch = IFXcharAt(++i);
}
PFX[j++]=numBuffertoString();//break;
numBuffer = new StringBuffer(); //清空已获取的运算数字
continue; //这里要重新循环,因为i已经增加过了
case '(':
spush("(");break;
case ')':
while(speek()!="(")
PFX[j++]=spop();
break;
case '+':
case '-':
while(ssize()>1&&speek()!="(")
PFX[j++]=spop();
a=StringvalueOf(ch);
spush(a);break;
case '':
case '/':
while(ssize()>1&&(speek()=="")||speek()=="/"
||speek()=="s"||speek()=="c"||speek()=="t"
||speek()=="^"||speek()=="√")//优先级比较,与栈顶比较,
PFX[j++]=spop();//当前 *** 作符优先级大于等于栈顶的d出栈顶
a=StringvalueOf(ch);
spush(a);break;
case 's':
case 'c':
case 't'://三角函数
while(ssize()>1&&(speek()=="s"||speek()=="c"||speek()=="t"
||speek()=="^"||speek()=="√"))//优先级比较,与栈顶,大于等于的d出
PFX[j++]=spop();
a=StringvalueOf(ch);
spush(a);break;
case '^':// 幂
case '√':// 开方
while(ssize()>1&&(speek()=="^"||speek()=="√"))
PFX[j++]=spop();
a=StringvalueOf(ch);
spush(a);break;
}
i++;
}
while(ssize()>1)
PFX[j++]=spop();
PFX[j]="=";
}
public static String Evaluate (String []PFX)//后缀表达式求值
{
int i=0;
double x1,x2,n;
String str;
Stack<String> s= new Stack<String>();
while(PFX[i]!="=")
{
str=PFX[i];
switch(strcharAt(0))
{
case '0':case '1':case '2':
case '3':case '4':case '5':
case '6':case '7':case '8':
case '9':
spush(str);break;
case '+':
x1=DoubleparseDouble(spop());
x2=DoubleparseDouble(spop());
n=x1+x2;
spush(StringvalueOf(n));break;
case '-':
x1=DoubleparseDouble(spop());
x2=DoubleparseDouble(spop());
n=x2-x1;
spush(StringvalueOf(n));break;
case '':
x1=DoubleparseDouble(spop());
x2=DoubleparseDouble(spop());
n=x1x2;
spush(StringvalueOf(n));break;
case '/':
x1=DoubleparseDouble(spop());
x2=DoubleparseDouble(spop());
n=x2/x1;
spush(StringvalueOf(n));break;
case 's':
x1=DoubleparseDouble(spop());
n=Mathsin(x1 MathPI / 180);
spush(StringvalueOf(n));break;
case 'c':
x1=DoubleparseDouble(spop());
n=Mathcos(x1 MathPI / 180);
spush(StringvalueOf(n));break;
case 't':
x1=DoubleparseDouble(spop());
n=Mathtan(x1 MathPI / 180);
spush(StringvalueOf(n));break;
case '√':
x1=DoubleparseDouble(spop());
n=Mathsqrt(x1);
spush(StringvalueOf(n));break;// 开方
case '^':
x1=DoubleparseDouble(spop());
x2=DoubleparseDouble(spop());
n=Mathpow(x2, x1);
spush(StringvalueOf(n));break;
}
i++;
}
return spop();
}
public static void main(String[] args) {
Systemoutprintln("请输入一个表达式:");
String s= new Scanner(Systemin)next();//sin452,sin 要用stringreplace转换成 s
s+="=";
String[] PFX = new String[100];
TrnsInToSufix(s, PFX);
Systemoutprintln("该算式的结果是:"+Evaluate(PFX));
}
}
1、首先在电脑打开eclipse软件,创建Scanner对象。
2、然后输出信息,请求用户输入要输入计算的阶乘数。代码:Systemoutprintln("请输入要计算的阶乘数:");
3、然后创建num接受键盘输入的信息。再创建n,sum。
4、然后创建for语句,进行计算阶乘。
5、然后在最后,输出所算的阶乘结果。代码:Systemoutprintln(n+"的阶乘为"+sum);
6、然后再点击程序运行按钮。在下面的窗口就可以看到运行结果。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)