Java中的高精度整数和高精度小数

在实际编码中,会遇到很多高精度的事例,比如,在计算金钱的时候就需要保留高精度小数,这样计算才不会有太大误差:

在下面的代码中,我们验证了,当两个float型的数字相加,得到的结果和我们的预期结果是有误差的,为了减小和防止这种误差的出现,我们需要使用BigInteger类和BigDecimal类来计算。

package com.ietree.base.number;

import java.math.BigDecimal;
import java.math.BigInteger;

public class BigIntegerTest {

    public static void main(String[] args) {
        float f1 = 123.01f + 2.01f;
        // 预期输出:125.02,实际输出:125.020004
        System.out.println(f1);
        // 预期输出:125.02,实际输出:125.02000000000001
        System.out.println(123.01 + 2.01);
        System.out.println("===============================");

        // 高精度整数测试
        BigInteger bint1 = new BigInteger("125");
        BigInteger bint2 = new BigInteger("999");
        BigInteger tmp;
        // 相加
        tmp = bint1.add(bint2);
        System.out.println("bint1 + bint2 = " + tmp);
        // 相减
        tmp = bint2.subtract(bint1);
        System.out.println("bint2 - bint1 = " + tmp);
        // 相乘
        tmp = bint1.multiply(bint2);
        System.out.println("bint1 * bint2 = " + tmp);
        // 相除
        tmp = bint2.divide(bint1);
        System.out.println("bint2 / bint1 = " + tmp);
        // 求余数
        tmp = bint2.remainder(bint1);
        System.out.println("bint2 % bint1 = " + tmp);
        // 求次方
        tmp = bint2.pow(2);
        System.out.println("bint2的二次方 = " + tmp);
        System.out.println("======================================");

        // 高精度小数测试
        BigDecimal bd1 = new BigDecimal(123.01);
        BigDecimal bd2 = new BigDecimal(2.01);
        BigDecimal bd;
        // 相加
        bd = bd1.add(bd2);
        System.out.println("bd1 + bd2 = " + bd);
        // 相减
        bd = bd1.subtract(bd2);
        System.out.println("bd2 - bd1 = " + bd);
        // 相乘
        bd = bd1.multiply(bd2);
        System.out.println("bd1 * bd2 = " + bd);
        // 相除
        // bd = bd1.divide(bd2);
        bd = bd1.divide(new BigDecimal(2.0));
        System.out.println("bd1 / 2.0 = " + bd);
        // 求余数
        bd = bd1.remainder(bd2);
        System.out.println("bd2 % bd1 = " + bd);
        // 求次方
        bd = bd1.pow(3);
        System.out.println("bd2的三次方 = " + bd);
        System.out.println("======================================");

        // 四舍五入保留小数位数
        BigDecimal bd3 = new BigDecimal(123.01).setScale(5,5);
        System.out.println("bd3 = " + bd3);
    }
}
时间: 2024-08-12 12:12:45

Java中的高精度整数和高精度小数的相关文章

Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数

Java中要使用 BigDecimal(定点数) 进行小数的相关操作,避免使用float等浮点数,因为 float, double等浮点的存储和操作(比如:相加,相减...)存在误差(7.22f - 7.0f = 0.21999979 而不是 0.22). 下面以 BigDecimal 进行减法为例: /**  * 精确的减法  */ public static double subtract(double v1, double v2) { BigDecimal d1 = new BigDeci

正则表达式匹配字符串中是否的整数价格和小数价格

/**     * 匹配字符串中是否的整数价格和小数价格     * @param str     * @return     */    public static String Match_the_amount(String str) {        String pattern[] = {"[1-9]\\d*\\u5143|[1-9]\\d*.\\d*\\u5143|0.\\d*[1-9]\\d*\\u5143|"                + "[1-9]\\d

Java中几种常用的设置小数点后位数的方法

记录下几种常用的控制小数点后位数的方法,除了这几种还有很多方法也可以控制,但是用得不常见,下面是比较常见的几种方法 使用BigDecimal类对超长数字进行格式化控制 使用DecimalFormat格式化十进制数字 使用printf格式化输出 具体实现 package _12_26_test; import java.math.BigDecimal; import java.math.BigInteger; import java.text.DecimalFormat; /*控制小数点后位数的几

java中double类型显示两个小数,比如12.00

Double类型的数据如何保留两位小数? 各位大虾,现有Double类型的数据,如何转换为保留两位小数的数,返回值的类型仍然是Double类型的,而不是字符串类型. 比如     0,返回"0.00": 提示:DecimalFormat       df       =       new       DecimalFormat( "#####0.00 ");                       System.out.println(df.format(d)

java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定

一. 计算机的小数计算一定范围内精确,超过范围只能取近似值: 计算机存储的浮点数受存储bit位数影响,只能保证一定范围内精准,超过bit范围的只能取近似值. java中各类型的精度范围参见:http://blog.csdn.net/longshenlmj/article/details/47616481 编程时注意: doulbe类型的数,不能用等号判定是否相等(或者是一定范围内可以).因为两次同样的计算(除法)结果可能出现小数部分不同.甚至极端的时候,初始化两个小数时,都可能不相等(用数值和字

JAVA中的小数

JAVA中的小数称为浮点数 1.有两种类型: float:单精度浮点数.4个字节. double:双精度浮点数.8个字节. 2.类型转换 容量小  ------------------------------->  容量大 byte,short,char << int << long << float << double 容量小的类型会自动向容量大的提升:同时,容量大的向小的转,会发生精度丢失. 如下,整数127赋值给float和double的变量时,

高精度之大数乘小数

今天下载百度文库资料时发现了 发现了内蒙古电子信息学院的ACM模板. 打开看了一下刚开始就是高精度的计算问题. 于是我就写了写.说实话在我的心里对这些东西有点抵触.因为接触的时候没能很好的掌握所以以后遇到这样的问题总是逃避,虽然逼着自己也能写出来,但是就是不愿意去写. 今天看到一个人的博客让我受益很深.其实不是内容,当然内容也很好.让我感觉到,其实厉害的人不是有多大的成就,会多少别人听都没听过的知识,把一件小事情做好,做的自己满意这就是成功. 闲话不扯了,我们来说一下高精度乘法问题. 大数乘小数

”高精度整数删去若干位以使剩下的值最小“问题

问题描述: 键盘输入一个高精度的正整数N(不超过240位) ,去掉其中任意M个数字后剩下的数字按原左右次序将组成一个新的正整数. 编程对给定的N和M,寻找一种方案使得剩下的数字组成的新数最小.输出组成的新的正整数. 输入数据均不需判错. 如果去掉了某几个位后得到的新整数开头为0,保留0. 输入: 本题有多组测试数据,每组测试数据占一行. 一个高精度正整数N(N不超过240位)一个正整数M.(M为不大于N的长度的正整数) N,M由一个空格分开. 456547 1 456547 2 456547 3

高精度整数 - a+b(王道)

题目描述: 实现一个加法器,使其能够输出a+b的值. 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位. 输出: 可能有多组测试数据,对于每组数据,输出a+b的值 样例输入: 2 6 1000000000000000000000 10000000000000000000000000000000000000000000 样例输出: 8 100000000000000000000000000000000000000000000 #include <iostream> #include