Java深海拾遗系列(5)--- 精度计算中的BigDecimal,double和float

在金融计算中,必须要使用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]);
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值