分享一下俺最近遇到的一些常见的语法错误:

今天写一个之前写过的题——求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);//输出
    }
}

首先,编译时就遇到了两个错误;

java 求sin java求sin近似值_java 求sin

  • (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 求sin java求sin近似值_Math_02

这里涉及到Java浮点数的问题。

        在默认情况下小数都被看作 double型,若想使用float型小数,则需要在小数后面添加F或f.另外,

使用后缀d或D可以来明确表明这是一个double类型数据,但加不加d或D并没有硬性规定。而定义

float型变量时,如果不加F或f,系统会认为是 double 类型数据,进而出错。      

        而在Java中用printf输出时float类型和double类型均用%f,并没有%lf。

经千辛万苦,这个程序终于可以运行了,可是得到了一个违背常识的答案。(qwq)

java 求sin java求sin近似值_java_03

 怎么会如此大!!!(其实还存在超大负数的时候@-@)

java 求sin java求sin近似值_Java_04

 试着将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)可以;
  • (二)使用数据类型时应注意其范围;
  • (三)浮点型数据注意其定义与输出;