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程序计算结果出错的主要内容,如果未能解决你的问题,请参考以下文章