/*
* 1.java中基础类型数据的溢出问题和c,c++不同,c中出现一处情况的时间,
* 数据会出现错误但是在java语言中,当出现溢出情况的时间,该变量会变
* 成自身基础类型能表达的最小值。这一点往往容易忽略,造成错误。
* 2.下面代码刚好可以说明问题,大致一看,输出应该是50。但是该循环
* 却是一个无限循环
*/
public class CycUtmost {
public static void main(String[] args) {
int end = Integer.MAX_VALUE;
int start = end - 50;
int count=0;
for(int i=start; i<=end; i++) {
count++;System.out.println(count);
}
}
}
因此在遇到数据类型边界问题的时间,需要谨慎对待,或者直接使用java中的BigDecimal类来进行计算。如下:
/*
* 1.java中的BigDecimal用于精确计算,它可以计算到小数点后任意位,
* 也就是大数计算,和c,c++不同,java直接给出大数精确计算的类,
* 可以直接使用
* 2.定义BigDecimal类,和平时的定义相同,中间可以添加字符串来实
* 现该对象的构造
* 3.加减乘除相对应的方法分别为:add() subtract() multiply() divide()
*
* 注意:对于divide方法来说,当碰到无限循环的结果的时间,会出现异常报错,
* 因此需要在使用时间指定参数来避免出现该问题
*/
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;
public class AccuratelyFloat {
public static void main(String[] args) {
BigDecimal sv = new BigDecimal("3");//定义BigDecamil类
String str = new String();
Scanner sc = new Scanner(System.in);
//str = sc.nextLine();
BigDecimal sv1 = new BigDecimal("10");
BigDecimal result = sv1.add(sv);//BigDecimal加 减 乘 除 精确计算
System.out.println(result);
result = sv1.subtract(sv);
System.out.println(result);
result = sv1.multiply(sv);
System.out.println(result);
result = sv1.divide(sv,100,BigDecimal.ROUND_HALF_UP);//除数 小数点后几位 四舍五入
System.out.println(result);
}
}
实例:输出1+ 1/2! + 1/3! + 1/4! + 1/5! +…..+ 1/n! 的结果,输出精确结果
import java.math.BigDecimal;
public class Example1 {
public static void main(String[] args) {
BigDecimal sum = new BigDecimal("1");
BigDecimal max = new BigDecimal("1");
BigDecimal i = new BigDecimal("2");
BigDecimal x = new BigDecimal("1");
int v=1;
while( v<20 ) {
max = max.multiply(i);
sum = sum.add(x.divide(max,100,BigDecimal.ROUND_HALF_UP));
i = i.add(x);
v++;
// System.out.println("max="+max);
// System.out.println("sum="+sum);
// System.out.println("i="+i);
}
System.out.println(sum);
}
}