「」小议数据类型

车辆限行查询2022-07-06  17

介绍

我们知道Java中有float和double类型,它们的主要设计目标是科学计算和工程计算。然而,它们不能提供完全精确的结果[因为它们的有效数字有限],因此它们不应该用于需要精确结果的场合。然而,商业计算通常需要更精确的结果。这个时候BigDecimal的重要性就不言而喻了!

BigDecimal简介

BigDecimal由任意精度的整数无标度值和32位整数组成。BigDecimal创建的是一个对象。我们不能用+、-、*、/等传统的算术运算符直接对它的对象进行数学运算,而必须调用它对应的方法。方法中的参数也必须是BigDecimal的对象。

BigDecimal有四种构造方法:

BigDecimal(int)用参数指定的整数值创建一个对象。

BigDecimal(double)使用参数指定的双精度值创建对象。

BigDecimal(long)使用参数指定的长整型值创建对象。

BigDecimal(String)用参数指定的数值作为字符串创建一个对象。

BigDecimal的运算方式不支持+-*/并且有自己的运算方法:

BigDecimal add(BigDecimal被加数)加法运算。

Bigdecimal subtract(Bigdecimal subtract)减法运算。

Bigdecimal multiply(Bigdecimal multiply)乘法运算。

Bigdecimal divide(Bigdecimal divider)除法运算。

示例代码

构造函数(两个常见的构造函数,其主要测试参数类型是double和String)

BigDecimal a double = new BigDecimal(1.22);

System.out.println("构造函数接受double类型的值,结果为:"+a double ");

BigDecimal aString = new BigDecimal(" 1.22 ");

System.out.println("构造函数接受String类型的值,结果为:"+aString ");

你认为输出会是什么?输出结果如下:

构造函数接受double类型的值,结果是

1.2199999999999999733546474089962430298328399658203125

构造函数接受一个字符串值,结果是:1.22

JDK大十进制的描述

1.双参数类型的构造方法的结果是不可预测的。有人可能会认为用Java写newBigDecimal(0.1)创建的BigDecimal正好等于0.1(非定标值1,其小数位数为1),但实际上等于0.1000000000000005这是因为0.1无法精确表示为double(或者在这种情况下,无法表示为任意有限长度的二进制小数)。因此,传入构造函数的值不会恰好等于0.1(尽管表面上等于该值)。

2.另一方面,字符串构造方法是完全可预测的:编写newBigDecimal("0.1 ")将创建一个BigDecimal,它正好等于预期的0.1。所以相比较而言,通常建议先用字符串构造法。

3.当double必须作为BigDecimal的源时,请注意这种构造方法提供了一种准确的转换;它提供的结果与下面的不同:首先使用Double.toString(double)方法,然后使用

BigDecimal (String)构造了一个将double转换为String的方法。要获得结果,请使用静态valueOf(double)方法。

加法运算

BigDecimal a = new BigDecimal(" 1.22 ");

System.out.println("构造函数接受String类型的值,结果为:"+a ");

BigDecimal b = new BigDecimal(" 2.22 ");

a .增加(b);

System.out.println("此时a的值为:"+a ");

很容易认为它会输出:

构造函数接受一个字符串值,结果是:1.22

此时a的值为:3.44。

但实际上调用方法后A的值是:1.22

摘要

(1) BigDecimal一般用于商业计算,因为涉及金额和数据,所以必须有超高的精度要求。

(2)尽量使用参数类型为String的构造函数。

(3)BigDecimal是不可变的,每次运算都会生成一个新的对象,所以做加减乘除时一定要保存运算后的值。

(4)我们往往会忽略JDK底层的一些实现细节,从而导致错误,需要更多的关注。

需要更多干货笔记的朋友,欢迎关注微信官方账号【老九书院】(づ 3 づ) ~

转载请注明原文地址:https://juke.outofmemory.cn/read/613126.html

最新回复(0)