在金融计算中,必须要使用BigDecimal,double和float都不适合。
计算机进行的是二进制运算,我们输入的十进制数字会先转换成二进制,进行运算后再转换为十进制输出。double和float提供了快速的运算,然而问题在于转换为二进制的时候,有些数字不能完全转换,只能无限接近于原本的值,这就导致了你看到的不正确的结果。
“BigDecimal可以表示任意精度的小数,并对它们进行计算。但要小心使用 BigDecimal(double)
构造函数,因为它会在计算的过程中产生舍入误差。最好要使用基于整数或 String 的构造函数来创建BigDecimal对象。”
2 / 0
的时候程序会报java.lang.ArithmeticException
的错误,那么你知道2.0 / 0
的结果吗?”结果是Infinity
(英菲尼迪),。其实就是无穷的意思。不仅有正无穷大,还有负无穷大,甚至还有一个叫做NaN
的特殊值。NaN
代表‘不是一个数字’。这些值的存在是为了在出现错误条件时,程序还可以用特定的值来表示所产生的结果。这些错误的情况包括算术溢出、给负数开平方根,还有您说的除以 0 等。
一道关于数组的问题,你稍等一下,我在纸上写一下。”
int[] a = {1, 2, 3, 4}
int[] b = {2, 4}
int[] c = {1, 3}
int[] d = {2}
“有这样四个数组,要求每个数组只留一个唯一的元素。也就是说,a、b、c、d四个数组之间的元素不能相同,你打算怎么做呢?
import java.util.ArrayList;
public class Distinct {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4};
int[] b = {2, 4};
int[] c = {1, 3};
int[] d = {2};
int[][] input = {a, b, c, d};
//记录每个数组留下的唯一的元素
ArrayList<Integer> result = new ArrayList<Integer>();
//记录每个数组留下的唯一元素在数组中的位置
ArrayList<Integer> index = new ArrayList<Integer>();
int row = 0;
int column = 0;
do {
boolean isBacktrack = false; //记录当前状态,是否是回溯
while(column < input[row].length) {
Integer current = input[row][column];
//当前元素是否已存在结果集中
boolean isContained = result.contains(current);;
//若当前元素不存在结果集中,将该元素加入结果集,并遍历下一行
if(isContained == false) {
result.add(current);
index.add(column);
column = 0;
row++;
break;
}
//如果当前元素已经存在结果集中,并且已经到达本行最后一个元素,则回溯一行
else if(column + 1 == input[row].length) {
result.remove(result.size() - 1);
column = index.get(index.size() - 1) + 1;
index.remove(index.size() - 1);
row--; //回溯一行
isBacktrack = true;
break;
}
column++;
}
//如果是回溯,判断列数是否超过该行的界限,如果超过了,再回溯一行
if(isBacktrack && column == input[row].length) {
result.remove(result.size() - 1);
column = index.get(index.size() - 1) + 1;
index.remove(index.size() - 1);
row--; //回溯一行
isBacktrack = true;
}
}while(row < input.length);
//把 result 中的每个元素赋给相应的数组
for(int i = 0; i < result.size(); i++) {
input[i] = new int[] {result.get(i)};
}
//打印每个数组的元素
for(int[] i: input) {
System.out.println(i[0]);
}
}
}