JAVA程序计算结果出错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA程序计算结果出错相关的知识,希望对你有一定的参考价值。

package wodechengxu;
public class Jiage

public static void main(String[] args)

Xigua xigua1;
xigua1=new Xigua();
xigua1.set单价(1);
xigua1.set半径(0.15);
xigua1.set密度(1.1*10*10*10);
System.out.println("这个半径是"+xigua1.get半径()+"单价是"+xigua1.get单价()+"密度是"+xigua1.get密度()+"的西瓜重量是"+xigua1.get重量()+"价格是"+xigua1.get价格());




package wodechengxu;
public class Xigua

double 半径;
double 密度;
double 重量;
double 价格;
double 单价;
public double get半径()

return 半径;

public void set半径(double 半径)

this.半径 = 半径;

public double get密度()

return 密度;

public void set密度(double 密度)

this.密度 = 密度;

public double get重量()

重量=(4/3)*3.14*半径*半径*半径;
return 重量;

public void set重量(double 重量)

this.重量 = 重量;

public double get价格()

价格=(4/3)*3.14*重量*密度*单价;
return 价格;

public void set价格(double 价格)

this.价格 = 价格;

public double get单价()

return 单价;

public void set单价(double 单价)

this.单价 = 单价;




刚学不久,大神勿喷,谢谢
这个半径是0.15单价是1.0密度是1100.0的西瓜重量是0.010597499999999998价格是36.60376499999999

这是程序出的结果,跟用计算器算出来不一样

看到中文 有种....真没看过 哈哈
原因是因为java 的double类型数据是不精准的

实际开发会用下面api 提供的类

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是
BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。

BigDecimal bigLoanAmount = new BigDecimal("具体数值"); //创建BigDecimal对象
BigDecimal bigInterestRate = new BigDecimal("具体数值");
BigDecimal bigInterest = bigLoanAmount.multiply(bigInterestRate); //BigDecimal运算
NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
NumberFormat percent = NumberFormat.getPercentInstance(); //建立百分比格式化用
percent.setMaximumFractionDigits(3); //百分比小数点最多3位
//利用BigDecimal对象作为参数在format()中调用货币和百分比格式化
System.out.println("Loan amount:\t" + currency.format(bigLoanAmount));
System.out.println("Interest rate:\t" + percent.format(bigInterestRate));
System.out.println("Interest:\t" + currency.format(bigInterest));
输出结果
Loan amount: ¥129,876,534,219,876,523.12
Interest rate: 8.765%
Interest: ¥11,384,239,549,149,661.69追问

感觉新鲜就用中文试了下

参考技术A 太厉害了 第一次见有人用中文命名

4/3是取整的 结果是1
计算器算的 4/3=1.33333333333333

所以有误差追问

感觉挺新鲜,就是尝试一下

追答

enen 知道问题了吧!

参考技术B 首先:Java是一群外国人发明的语言!所以一般命名都是用英文的!用英文尊重下人家把,但是也可以用中文。估计你以后工作会别出心裁的! 而且有些时候用中文命名会出错!
第二:正题:double类型的数据是有误差的! double类型的数据不能精确的表示数据!举个例子: 比如 int i=0;3/i Java的编译器会出异常! 但是 double i=0; 2/i 就不是异常。原因是double类型的数据不等于0,而是无限接近于0,但它不是0,既然double表示的数据可能有误差,那么算出来的结果就不一定是非常准确的!
参考技术C 好神奇的代码,原来可以这样子写,
(float)4/3*3.14*重量*密度*单价这样就对了.追问

呵呵,其实我是感觉中文挺新鲜的,就用中文了

参考技术D 因为java里边4/3=1,所以你要换一下 比如 4.0/3追问

还是不行啊,主要是不是小数级的差别,差别有点大

追答

不是啊,在java里整数相除会自动取整的,改成这样就行了的,亲测

Java11月18日

动手动脑

实验一:

1. 下边的程序运行结果是什么?

2.你如何解释会得到这样的输出?

3.计算机是不会出错的,之所以得到这样的运行结果也是有原因的那么从这些运行结果中,你能总结出Java的哪些语法特性?

程序源代码:

public class ParentChildTest {

       public static void main(String[] args) {

              Parent parent=new Parent();

              parent.printValue();

              Child child=new Child();

              child.printValue();

             

              parent=child;

              parent.printValue();

             

              parent.myValue++;

              parent.printValue();

             

              ((Child)parent).myValue++;

              parent.printValue();

             

       }

}

 

class Parent{

       public int myValue=100;

       public void printValue() {

              System.out.println("Parent.printValue(),myValue="+myValue);

       }

}

class Child extends Parent{

       public int myValue=200;

       public void printValue() {

              System.out.println("Child.printValue(),myValue="+myValue);

       }

}

 

(1)实验结果运行图:技术分享

(2)这样结果输出的原因:

   答:首先前两个分别引用各自的类的变量,所以分别是100和200没有什么异议,第三个把子类的赋值给父类了,所以输出结果为200,第四个因为只是改变了弗雷德变量值,没有改变子类的变量值,所以仍为200,而此时父类的为101。最后对子类进行强制转换,所以变量值也发生了改变为201.

(3)当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。

这个特性实际上就是面向对象“多态”特性的具体表现。

实验二:多态方法模拟ATM程序

//ATM

//zhanxinwu,November ,15,2016.

 

import java.util.Scanner;

abstract class QuKuan

{

    abstract int qukuan();

}

class Account extends QuKuan

{    

       String ID;

       String name;

       String Date;

       int operate;

       String mima;

       double yue;

       Account()

       {

              ID="1234567891a";

              mima="123456";

              yue=0;

       }

       int qukuan()

       {

              int flag=0;

              double qu=0;

              System.out.println("欢迎选择取款:");

              System.out.println("1 100");

              System.out.println("2 500");

              System.out.println("3 1000");

              System.out.println("4 1500");

              System.out.println("5 2000");

              System.out.println("6 5000");

              System.out.println("7 其他金额");

              System.out.println("8 退卡");

              System.out.println("9 返回上一界面");

              System.out.print("请选取要取款的金额‘操作数‘:");

              Scanner scanner=new Scanner(System.in);

              operate=scanner.nextInt();

              while(operate<1||operate>9)

              {

                     System.out.print("请重新选取要取款的金额‘操作数’:");

                     operate=scanner.nextInt();

              }

       switch(operate){

             case 1:qu=100;

                    

             case 2:qu=500;

      

             case 3:qu=1000;

             case 4:qu=1500;

             case 5:qu=2000;

             case 6:qu=5000;

                    

             case 7:{System.out.print("请输入要取款的金额:");

                   qu=scanner.nextDouble();

                     if(yue<qu)

                     {

                            System.out.println("余额不足!");

                     }

                     else

                     {

                            yue-=qu;

                            System.out.println("取款成功,余额为:"+yue);

                     }

             }

              }

             

              return flag;

       }

      

       void xiugaimima()

       {

 

              System.out.print("请输入要修改的取款账号所对应的密码:");

              Scanner scanner=new Scanner(System.in);

              String mi=scanner.next();

              mima=mi;

              System.out.println("修改后的取款账号所对应的密码为:"+mima);

       }

      

       void cunkuan()

       {

              System.out.print("请输入要存款的金额:");

              Scanner scanner=new Scanner(System.in);

              double yu=scanner.nextDouble();

              yue+=yu;

              System.out.println("存款成功,余额为:"+yue);

       }

      

       void chaxun()

       {

              System.out.println("余额为:"+yue);

       }

      

       void zhuanzhang()

       {

              System.out.print("请输入转入的行号:");

              Scanner scanner=new Scanner(System.in);

              String hang=scanner.next();

              System.out.print("请输入要转账的金额:");

              double yu=scanner.nextDouble();

              if(yue<yu)

              {

                     System.out.println("余额不足,请充值!!!");

              }

              else

              {

                     yue-=yu;

                     System.out.println("转账成功,余额为:"+yue+",已转入到"+hang+"中"+yu+"元");

              }

       }

}

 

public class ATMduo

{

       public static void main(String[] args)

       {

              int k;

              Scanner scanner=new Scanner(System.in);

              Account m=new Account();

              while(true)

              {

                    

                            System.out.print("请输入密码:");

                            String n=scanner.next();

                            if(n.equals(m.mima))

                            {

                                   while(true)

                                   {

                                          System.out.println("1 存款");

                                          System.out.println("2 取款");

                                          System.out.println("3 转账汇款");

                                          System.out.println("4 修改密码");

                                          System.out.println("5 查询余额");

                                          System.out.println("6 退出系统");

                                          System.out.print("请输入操作项:");

                                          k=scanner.nextInt();

 

                                          if(k==1) m.cunkuan();

                                          if(k==2)

                                          {

                                                 int g=m.qukuan();

                                                 if(g==1) break;

                                          }

                                          if(k==3) m.zhuanzhang();

                                          if(k==4) m.xiugaimima();

                                          if(k==5) m.chaxun();

                                          if(k==6) break;

                                   }

                            }

                            else System.out.println("该卡已被锁定,请联系银行工作人员!!!");

                    

              }

       }

}

 

以上是关于JAVA程序计算结果出错的主要内容,如果未能解决你的问题,请参考以下文章

java异步计算Future的使用(转)

运行hangman(Java)的程序中的逻辑出错

java程序单独运行正确,用jsp调用就出错,希望大家帮忙

Java数组运算

java float除法的问题

Java多态课后动手动脑