分享一下俺最近遇到的一些常见的语法错误:
今天写一个之前写过的题——求sinx的近似值(x为弧度制),精确要求:当通项的绝对值小于10^-6时为止。迫不及待想用Java试试,一试就发现了一些问题。
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner (System.in);
int i=1,flag=1,x,factorial=1;
x=in.nextInt();//输入度数
double n=x;
double sum=0;//存放结果
while(1){
if((n*1.00/factorial)>=pow(10,-6)){
break;
}
sum+=(flag*n*1.00)/factorial;
factorial=factorial*(i+1)*(i+2);//阶乘
i+=2;
flag*=-1;
n=n*x*x;
}
System.out.printf("%.6lf",sum);//输出
}
}
首先,编译时就遇到了两个错误;
-
(1)int 无法转化为boolean;
在Java中有八大基本数据类型,如图
基本数据类型 | 内存空间(8位等于1字节) | 取值范围 |
byte | 8位 | -2^8 - 2^8-1 |
short | 16位 | -2^16 - 2^16-1 |
int | 32位 | -2^32 - 2^32-1 |
long | 64位 | -2^64 - 2^64-1 |
float | 32位 | -2^32 - 2^32-1 |
double | 64位 | -2^64-2^64-1 |
boolean | 1位 | true/false |
char | 16位 | -2^16 - 2^16-1 |
同C语言一样,while()中括号里面为循环条件,但Java的条件为boolean类型,只占一位,C语言里面可以将1,0隐式转化为布尔值,而Java限制了这种行为,对Java而言1,0就是整型,而非布尔类型,故不可以用1和0表示。(如果要用的话可以用while(true))
-
(2)Java中pow函数不能直接使用,需要导入Math包,即:
import static java.lang.Math.*;
-
注意:Java中pow函数是double型的,若要使用整数,需要强制转换类型
-
Math包中还有一些其他常用的函数,如下:
-
Math.sqrt():计算平方根
-
Math.cbrt():计算立方根
-
Math.pow(a,b):计算a的b次方
-
Math.max( , ):计算最大值
-
Math.min( , ):计算最小值
-
Math.abs():取绝对值
如果修改后再进行编译运行,在pta上就会有个非零返回,这是为何???
这里涉及到Java浮点数的问题。
在默认情况下小数都被看作 double型,若想使用float型小数,则需要在小数后面添加F或f.另外,
使用后缀d或D可以来明确表明这是一个double类型数据,但加不加d或D并没有硬性规定。而定义
float型变量时,如果不加F或f,系统会认为是 double 类型数据,进而出错。
而在Java中用printf输出时float类型和double类型均用%f,并没有%lf。
经千辛万苦,这个程序终于可以运行了,可是得到了一个违背常识的答案。(qwq)
怎么会如此大!!!(其实还存在超大负数的时候@-@)
试着将n和factorial打印出来,你会发现n在某一时刻变为了负数,离谱吧。这是因为n的范围超过了int,占用了前面的符号位,还好break出来了,不然指定更加离谱。
-
注意:factorial和n都最好不要用int类型,int类型的范围过小,会出错,可以用double或者float或者long。
最后,修改如下:
import java.util.Scanner;
import static java.lang.Math.*;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner (System.in);
int i=1,flag=1,x;
double factorial=1;
x=in.nextInt();//输入度数
double n=x;
double sum=0;//存放结果
while((n*1.00/factorial)>=pow(10,-6)){
sum+=(flag*n*1.00)/factorial;
factorial=factorial*(i+1)*(i+2);//注意:factorial和n不要用int类型,int类型过小,会出错,建议用double或者float或long
i+=2;
flag*=-1;
n=n*x*x;
}
System.out.printf("%.6f",sum);
}
}
最后小结一下:
-
(一)while(1)不能在java使用,while(true)可以;
-
(二)使用数据类型时应注意其范围;
-
(三)浮点型数据注意其定义与输出;