java日志(二)

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

今天写一个之前写过的题——求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字节)取值范围
byte8位-2^8 - 2^8-1
short16位-2^16 - 2^16-1
int32位-2^32 - 2^32-1
long64位-2^64 - 2^64-1
float32位-2^32 - 2^32-1
double64位-2^64-2^64-1
boolean1位true/false
char16位-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)可以;

  • (二)使用数据类型时应注意其范围;

  • (三)浮点型数据注意其定义与输出;

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值