目 录
- 简单加法- - -小数精确计算问题
-
- 解题思路及注意事项
- 代码展示
简单加法- - -小数精确计算问题
话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。
这时他已经不是那个只会做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就是我对象,又酷又强大
飘了飘了