文档章节

拯救你丢失的精度——BigInteger和BigDecimal类(入门)

BWH_Steven
 BWH_Steven
发布于 06/17 08:59
字数 796
阅读 14
收藏 0

第三阶段 JAVA常见对象的学习

BigInteger和BigDecimal类

BigInteger类

(一) 构造方法:

//针对超过整数范围的运算(整数最大值:2147483647)
BigInteger(String val)  

####(二) 常用方法:

//加
public BigInteger add(BigInteger val)
//减
public BigInteger subtract(BigInteger val)
//乘
public BigInteger multiply(BigInteger val)
//除
public BigInteger divide(BigInteger val)
//返回商和余数的数组
public BigInteger[] divideAndRemainder(BigInteger val)	
import java.math.BigInteger;

public class BigIntegerDemo {
    public static void main(String[] args) {
        BigInteger bi1 = new BigInteger("100");
        BigInteger bi2 = new BigInteger("50");

        BigInteger[] bis = bi1.divideAndRemainder(bi2);
        System.out.println("商:" + bis[0]);
        System.out.println("余数:" + bis[1]);
    }
}

//运行结果
商:2
余数:0

BigInteger类

由于在运算的时候,float类型和double很容易丢失精度(下例为演示),所以为了能精确的表示、计算浮点数,Java提供了BigDecimal

public class BigDecimalDemo {
    public static void main(String[] args) {
        System.out.println(0.09 + 0.01);
        System.out.println(1.0 - 0.32);
        System.out.println(1.026 * 100);
        System.out.println(1.502 / 100);
        System.out.println(1.0 - 0.17);
    }
}

//运行结果
0.09999999999999999
0.6799999999999999
102.60000000000001
0.01502
0.83

(一) 构造方法:

我们来帖一组说明

BigDecimal

public BigDecimal(double val)

将double转换为BigDecimal ,这是double的二进制浮点值的精确十进制表示。

返回的BigDecimal是(10scale × val)是一个整数的最小值。

笔记:

  1. 这个构造函数的结果可能有些不可预测。 可以假设在Java中写入new BigDecimal(0.1)创建一个BigDecimal ,它完全等于0.1(非标尺值为1,比例为1),但实际上等于0.1000000000000000055511151231257827021181583404541015625。 这是因为0.1不能像double (或者作为任何有限长度的二进制分数)精确地表示。 因此,正在被传递给构造的值不是正好等于0.1,虽然表面上。
  2. 该String构造,在另一方面,是完全可以预测的:写new BigDecimal("0.1")创建BigDecimal这正好等于0.1,正如人们所期望的那样。 因此, 一般建议使用String constructor优先于此。
  3. 当double必须用作源为BigDecimal ,注意,此构造提供了一个精确的转换; 它不会将double转换为String使用Double.toString(double)方法,然后使用BigDecimal(String)构造函数相同的结果。 要获得该结果,请使用static valueOf(double)方法。
  • 参数

    val - double值转换为 BigDecimal 。

  • 异常

    NumberFormatException - 如果 val 是无限或NaN。

构造方法:建议使用 → BigDecimal(String s)

(二) 常用方法:

import java.math.BigDecimal;

public class BigDecimalDemo2 {
    public static void main(String[] args) {
        BigDecimal bd1 = new BigDecimal("0.09");
        BigDecimal bd2 = new BigDecimal("0.01");
        System.out.println("加:" + bd1.add(bd2));

        BigDecimal bd3 = new BigDecimal("1.0");
        BigDecimal bd4 = new BigDecimal("0.32");
        System.out.println("减:" + bd3.subtract(bd4));

        BigDecimal bd5 = new BigDecimal("1.026");
        BigDecimal bd6 = new BigDecimal("100");
        System.out.println("乘:" + bd5.multiply(bd6));

        BigDecimal bd7 = new BigDecimal("1.502");
        BigDecimal bd8 = new BigDecimal("100");
        System.out.println("除:" + bd7.divide(bd8));
    }
}

//运行结果
加:0.10
减:0.68
乘:102.600
除:0.01502

结尾:

如果内容中有什么不足,或者错误的地方,欢迎大家给我留言提出意见, 蟹蟹大家 !^_^

如果能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)

在这里的我们素不相识,却都在为了自己的梦而努力 ❤

一个坚持推送原创Java技术的公众号:理想二旬不止

img

© 著作权归作者所有

BWH_Steven
粉丝 1
博文 20
码字总数 43325
作品 0
珠海
私信 提问
Java的两个高精度的包装类

java提供了两个高精度计算的类,BigInteger和BigDecimal。虽然他们大体上属于包装类的范畴。但是二者没有对应的基本类型。他们的运算速度比较慢。在这里我们用速度换取了精度。 BigIntger支持...

扎西多顿
2015/09/25
8
0
常用类(三)

Integer Character Arrays BigDecimal/BigInteger Calendar 数组的排序方式及二分折半查找 一、Integer(方法补充) 1、十进制转换其他进制方法 public static String toBinaryString(int i):二...

走了丶
2017/07/28
0
0
【JavaSE(八)】Java常见对象(下)

原文地址:https://www.cloudcrossing.xyz/post/38/ 1 正则表达式 1.1 正则表达式概述 是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。 上面的代码中,public boolea...

苍云横渡
2018/05/18
0
0
Java中解决浮点数精度的问题

问题描述 在项目中用Java做浮点数计算时,发现对于4.015*100这样的计算,结果不是预料中的401.5,而是401.49999999999994。如此长的位数,对于显示来说很不友好。 问题原因:浮点数表示 查阅...

GreenDay
2016/09/30
81
0
java基础重点讲解,看了还不会找我(十三)

视频下载地址:https://download.csdn.net/download/xxfisgirlgad/10886817 ###14.01_常见对象(正则表达式的概述和简单使用) * A:正则表达式 * 是指一个用来描述或者匹配一系列符合某个语法规...

谢小芳是女神
2018/12/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦

全文共6706字,预计学习时长12分钟或更长 近日,《狮子王》热映,其逼真的外形,几乎可以以假乱真,让观众不禁大呼:awsl,这也太真实了吧! 实体模型、CGI动画、实景拍摄、VR等技术娴熟运用...

读芯术
28分钟前
1
0
C#经典面试题100道

1. .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34......

元歌
32分钟前
0
0
重磅!容器集群监控利器 阿里云Prometheus 正式免费公测

Prometheus 作为容器生态下集群监控的首选方案,是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native C...

阿里云云栖社区
33分钟前
1
0
LeetCode 160: 相交链表 Intersection of Two Linked Lists

爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点。 Write a program to find the node at which the intersection of two singly linked lists begins. 如下面的两个链...

iCodeBugs
35分钟前
2
0
hadoop yarn漏洞 8088端口进入挖矿病毒处理记录

早上发现服务器cpu使用异常 进程如图所示 按照挖矿病毒的套路 肯定是定时任务不停地执行脚本 遂查看定时任务 进入/var/spool/cron 查看定时任务 发现里面有一个root文件 定时任务每分钟执行一...

詹姆斯-高斯林
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部