当前位置: 代码迷 >> 综合 >> ACM基础题 | 简单加法_HDU-1753(Java实现)
  详细解决方案

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

热度:79   发布时间:2024-01-03 12:34:10.0

目 录

  • 简单加法- - -小数精确计算问题
    • 解题思路及注意事项
    • 代码展示

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

话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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就是我对象,又酷又强大
飘了飘了
表情包

  相关解决方案