ACM基础题 | 简单加法_HDU-1753(Java实现)

简单加法- - -小数精确计算问题

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。
现在,给你两个正的小数A和B,你的任务是代表大明计算出A+B的值。

Input
本题目包含多组测试数据,请处理到文件结束。
每一组测试数据在一行里面包含两个长度不大于400的正小数A和B。

Output
请在一行里面输出输出A+B的值,请输出最简形式。详细要求请见Sample Output。

Sample Input
1.1 2.9
1.1111111111 2.3444323343
1 1.1

Sample Output
4
3.4555434454
2.1

解题思路及注意事项

这道题乍一眼看上去神简单,但是如果你还没有接触过小数精确计算问题,可能就会掉入陷阱

  • 实际上float和double进行小数运算时会出现精度丢失的问题,这是因为float和double类型的数据存储和整数不一样导致的
    比如double = 1.0 - 0.9 输出结果并不是0.1 而是0.09999999…
  • 为了解决float和double运算时丢失精度问题,Java为我们提供了BigDecimal类,能够精确地表示、计算浮点数
  • 根据题意需要处理多组数据,通过While循环,使用hasNext()方法判断是否有输入数据,有则进入循环处理,没有则不进入
  • 根据题目要求,结果需要为最简形式,使用BigDecimal计算出来的小数后面会自动补零,比如计算结果为4.10000000000000,但所需要的为最简形式:4.1
  • 本题使用到的BigDecimal方法介绍:
    1)构造方法:BigDecimal(String val),能够将String类型的Val转化为BigDecimal类型
    2)成员方法:add(BigDecimal augend),能够实现两个BigDecimal类型的值求和
    3)成员方法:stripTrailingZeros(),能够去掉数值后面尾随的零,得到最简化的数值
    4)成员方法:toPlainString(),返回没有指数字段的此 BigDecimal的字符串表示形式,即当某数较大时结果可能使用带E的指数表示,比如4.03E6,表示4.03*106 ,使用该函数可以去掉指数字段即结果为4030000

代码展示

import java.math.BigDecimal;
import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		//键盘录入
		Scanner sc = new Scanner(System.in);
		//hasNext()函数用于判断是否还有输入内容
		while(sc.hasNext()) {
			//将用户输入的两个数直接存为BigDecimal类型
			BigDecimal bd1 = sc.nextBigDecimal();
			BigDecimal bd2 = sc.nextBigDecimal();
			//输出结果
			System.out.println(bd1.add(bd2).stripTrailingZeros().toPlainString());
		}
		//关闭键盘录入对象
		sc.close();
	}
}

骚话时刻:
BigDecimal就是我对象,又酷又强大
飘了飘了
表情包

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值