java数字相减_Java的加减乘除运算

这篇博客讲述了Java初学者在实现加减乘除运算时遇到的精度问题,特别是涉及浮点数计算时的不精确性。通过使用DecimalFormat和BigDecimal类,博主解决了这个问题,实现了精确到小数点后两位的计算,确保所有运算结果为99.99。

作为Java初学者,在学习了基本数据类型之后,大哥给我布置了作业,内容如下:

计算题:假如今天逛超市花了99.99 请用加减乘除,进行计算得到99.99这个结果。

要求:1,4个方法;

2,数值随意编写;

3,数值要用到int、long、float、double四种类型;

4,都是返回值,实例化后打印。

一开始,我建了4个类,按照加减乘除的拼音分别命名为jia、jian、cheng、chu,代码如下所示。

1 public class jia {  //加法

2 int a = 10;3 long b = 35;4 float c = 36.95f;5 double d = 18.04;6       public voidjiafa() {7     double jia =a + b + c +d;8     System.out.println("加法运算结果是:" +jia);9 }10 }

1 public classjian {  //减法2 long a = 300;3 int b = 18;4 float c = 128.7f;5 double d = 53.31;6 public voidjianfa() {7 float jian = (float)(a - b - c - (double)d);8 System.out.println("减法运算结果是:" +jian);9 }10 }

1 public class cheng { //乘法

2 int a = 1;

3 long b = 1000000;

4 float c = 0.000001f;

5 double d = 99.99;

6 public voidchengfa() {

7 double cheng = a * b * c *d;

8 System.out.println("乘法运算结果是:" +cheng);

9 }

10 }

1 public class chu { //除法

2 int a = 1000;3 long b = 1000000;4 float c = 0.001f;5 double d = 99.99;6 public voidchufa() {7   float chu = (float)((double)d/(a/b/c));8   System.out.println("除法运算结果是:" +chu);9 }10 }

然后,新建一个类,命名为yunsuan,将上述四则运算实例化并输出结果,代码如下:

1 public classyunsuan {2 public static voidmain(String[] args) {3 jia jiafa = new jia(); //实例化加法

4 jian jianfa = new jian(); //实例化减法

5 cheng chengfa = new cheng(); //实例化乘法

6 chu chufa = new chu(); //实例化除法

7

8 jiafa.jiafa(); //调用加法方法

9 jianfa.jianfa();10chengfa.chengfa();11chufa.chufa();12}13 }

运行结果如下图:

除了乘法之外,其他的运算都没有得到我想要的99.99这个结果,这是为什么呢?

经过讲解和查阅资料之后,原来浮点数是不适合精确计算的,原因是计算机里面数的计算都是二进制计算的,我们其实输入的十进制数,有些十进制数转换成二进制是可以精确转换,而有些转换则不是精确转换,得到的是一个最靠近它的数,所以这里面就存在一个误差。另外,如果浮点数不进行计算时,在十进制里面浮点数能正确显示,如果浮点数参与了计算,那么浮点数二进制与十进制间的转换过程就会变得不可而知,变得不可逆。

那么要想使得到的结果精确,可以使用Java DecimalFormat 类,用于格式化十进制数字。

用法:

importjava.text.DecimalFormat;

double pi = 3.1415926;

DecimalFormat form= new DecimalFormat("#.00");//#.00 表示两位小数 #.0000四位小数 以此类推

也可以使用Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。

用法:

importjava.math.BigDecimal;double a = 3.1516;

BigDecimal b= new BigDecimal(Double.toString(a));

以加法为例,我们可以用BigDecimal求值,代码示例如下:

1 importjava.math.BigDecimal;2

3 BigDecimal b1 = newBigDecimal(Double.toString(a));4 BigDecimal b2 = newBigDecimal(Double.toString(b));5 BigDecimal b3 = newBigDecimal(Double.toString(c));6 BigDecimal b4 = newBigDecimal(Double.toString(d));7

8 double a= b1.add(b2).add(b3).add(b4).doubleValue();

这里还要注意的是,除法得到的结果是Infinity,这是因为整型和整型相除,得到的仍然是整型;a = 100,b = 1000,a/b 应该等于0.001,实际上得到的是0.0,由于0不能做除数,因此得到的值是无效的,因此就需要Java数值之间的强制转换,强制转换是将需要转换的数值转换为需要的类型。

1 float chu = (float)((double)d4/(a4/b4/c4));        //错误写法

2 float chu = (float)((double)d4/((float)a4/(float)b4/c4)); //正确写法

经过深入理解,将以上代码整合到一个yunsuan的文件里,代码如下:

1 importjava.text.DecimalFormat;2

3 public classyunsuan {4 public voidjiafa(){5 int a1 = 10;6 long b1 = 35;7 float c1 = 36.95f;8 double d1 = 18.04;9

10 DecimalFormat form = new DecimalFormat("#.00");//保留两位小数

11 double jia =a1 + b1 + c1 +d1;12 System.out.println("加法运算结果是:" +form.format(jia));13 }14 public voidjianfa(){15 long a2 = 300;16 int b2 = 18;17 float c2 = 128.7f;18 double d2 = 53.31;19

20 DecimalFormat form = new DecimalFormat("#.00");//保留两位小数

21 float jian = (float)(a2 - b2 - c2 - (double)d2);22 System.out.println("减法运算结果是:" +form.format(jian));23 }24 public voidchengfa() {25 int a3 = 1;26 long b3 = 1000000;27 float c3 = 0.000001f;28 double d3 = 99.99;29

30 double cheng = a3 * b3 * c3 *d3;31 System.out.println("乘法运算结果是:" +cheng);32 }33 public voidchufa() {34 int a4 = 1000;35 long b4 = 1000000;36 float c4 = 0.001f;37 double d4 = 99.99;38

39 float chu = (float)((double)d4/((float)a4/(float)b4/c4));40 System.out.println("除法运算结果是:" +chu);41 }42

43 public static voidmain(String[] args) {44 yunsuan jiafa = new yunsuan(); //实例化

45 yunsuan jianfa = newyunsuan();46 yunsuan chengfa = newyunsuan();47 yunsuan chufa = newyunsuan();48

49 jiafa.jiafa();50 jianfa.jianfa();51 chengfa.chengfa();52 chufa.chufa();53 }54 }

亲测全部为99.99,结果正确。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值