Java中基本数据类型、不能用浮点数表示金额
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10831763.html
一:8种基本数据类型
8种基本数据类型(4整,2浮,1符,1布):
整型:byte(最小的数据类型)、short(短整型)、int(整型)、long(长整型);
浮点型:float(浮点型)、double(双精度浮点型);
字符型:char(字符型);
布尔型:boolean(布尔型)。
二: 整型中 byte、short、int、long 取值范围:记住存储位数即可
byte:一个字节有8位,去掉符号位还有7位,正数为避免进位还要减1,因此byte的取值范围为:-2^7 ~ (2^7-1),也就是 -128~127 之间。
short:short用16位存储,去掉符号位还有15位,正数为避免进位还要减1,因此short的取值范围是:-2^15 ~ (2^15-1)。
int:整型用32位存储,去掉符号位还有31位,正数为避免进位还要减1,因此整型的取值范围是 -2^31 ~ (2^31-1)。
long:长整型用64位存储,去掉符号位还有63位,正数为避免进位还要减1,因此长整型的取值范围是 -2^63 ~ (2^63-1)。
三:浮点型数据
浮点类型是指用于表示小数的数据类型。
单精度和双精度的区别:
单精度浮点型float,用32位存储,1位为符号位, 指数8位, 尾数23位,即:float的精度是23位,能精确表达23位的数,超过就被截取。
双精度浮点型double,用64位存储,1位符号位,11位指数,52位尾数,即:double的精度是52位,能精确表达52位的数,超过就被截取。
双精度类型double比单精度类型float具有更高的精度,和更大的表示范围,常常用于科学计算等高精度场合。
浮点数与小数的区别:
1)在赋值或者存储中浮点类型的精度有限,float是23位,double是52位。
2)在计算机实际处理和运算过程中,浮点数本质上是以二进制形式存在的。
3)二进制所能表示的两个相邻的浮点值之间存在一定的间隙,浮点值越大,这个间隙也会越大。如果此时对较大的浮点数进行操作时,浮点数的精度问题就会产生,甚至出现一些“不正常"的现象。
四:不能用浮点数来表示金额
1)精度丢失问题
从上面我们可以知道,float的精度是23位,double精度是63位。在存储或运算过程中,当超出精度时,超出部分会被截掉,由此就会造成误差。
对于金额而言,舍去不能表示的部分,损失也就产生了。
2)进制转换误差
从上面我们可以知道,在计算机实际处理和运算过程中,浮点数本质上是以二进制形式存在的。
而十进制的0.1在二进制下将是一个无限循环小数,这就会导致误差的出现。
如果一个小数不是2的负整数次幂,用浮点数表示必然产生浮点误差。
换言之:A进制下的有限小数,转换到B进制下极有可能是无限小数,误差也由此产生。
浮点数不精确的根本原因在于:尾数部分的位数是固定的,一旦需要表示的数字的精度高于浮点数的精度,那么必然产生误差!
解决这个问题的方法是BigDecimal的类,这个类可以表示任意精度的数字,其原理是:用字符串存储数字,转换为数组来模拟大数,实现两个数组的数学运算并将结果返回。
五:BigDecimal的使用要点
1、BigDecimal变量初始化——必须用传入String的构造方法
BigDecimal num1 = new BigDecimal(0.005);//用数值转换成大数,有误差
BigDecimal num12 = new BigDecimal("0.005");//用字符串转换成大数,无误差
因为:不是所有的浮点数都能够被精确的表示成一个double 类型值,有些浮点数值不能够被精确的表示成 double 类型值时,它会被表示成与它最接近的 double 类型的值,此时用它来初始化一个大数,会“先造成了误差,再用产生了误差的值生成大数”,也就是“将错就错”。
2、使用除法函数在divide的时候要设置各种参数,要精确的小数位数和舍入模式,其中有8种舍入模式:
、ROUND_UP 远离零的舍入模式。 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。 注意,此舍入模式始终不会减少计算值的大小。 、ROUND_DOWN 接近零的舍入模式。 在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。 注意,此舍入模式始终不会增加计算值的大小。 、ROUND_CEILING 接近正无穷大的舍入模式。 如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同; 如果为负,则舍入行为与 ROUND_DOWN 相同。 注意,此舍入模式始终不会减少计算值。 、ROUND_FLOOR 接近负无穷大的舍入模式。 如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同; 如果为负,则舍入行为与 ROUND_UP 相同。 注意,此舍入模式始终不会增加计算值。 、ROUND_HALF_UP 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。 如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。 注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。 、ROUND_HALF_DOWN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。 如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。 、ROUND_HALF_EVEN 向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同; 如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。 注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。 此舍入模式也称为“银行家舍入法”,主要在美国使用。 如果前一位为奇数,则入位,否则舍去。 以下例子为保留小数点1位,那么这种舍入方式下的结果。 1.15>1.2 1.25>1.2 、ROUND_UNNECESSARY 断言请求的操作具有精确的结果,因此不需要舍入。 如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException。
六:BigDecimal源码阅读
Todo。
七:Todo
大数运算的实现:https://www.cnblogs.com/hdwang/p/7642783.html
Java中基本数据类型、不能用浮点数表示金额的更多相关文章
- Java中基本数据类型和包装类
参考:深入剖析Java中的装箱和拆箱; Java中基本数据类型和包装类互转中 缓冲机制的使用; java学习笔记:装箱和拆箱,包装器和缓冲池 Java 各 类型数据在内存中分配情况详解 一 java内 ...
- java中的数据类型,运算符,字符串,输入输出,控制流,大数值,数组; 《java核心技术卷i》 第三章:java基本程序结构;
<java核心技术卷i> 第三章:java基本程序结构: 每次看书,去总结的时候,总会发现一些新的东西,这次对于java的数组有了更深的了解: java中的数据类型,运算符,字符串,输入输 ...
- Java中的数据类型及相互转换方法
本文主要讲解两个部分: 一.Java中的数据类型有哪些? 二.数字类型和字符串类型相互转换的方法? 一.Java中的数据类型有哪些: Java中的数据类型有:基本数据类型和引用数据类型: 基本数据类型 ...
- 讲说问题:|和||的区别以及&和&&的区别。2、Java中的数据类型分几类?基本数据类型有哪些?
|和||的区别以及&和&&的区别. |或 为或运算 判断为逻辑或 || 为短路或 只有逻辑判断 当左侧为真不再继续判断 &与 为与运算 判断为逻辑与 && ...
- Java中关于数据类型的一些问题
Java中关于数据类型的一些问题 总结一下最近笔试遇到的一些关于Java中数据类型的一些问题. 虽然比较基础,但在实际做题却很容易出错的点,而且往往这些题出错了会给面试官很不好的感觉:你的基础不好. ...
- Java中基本数据类型byte的溢出问题
Java中基本数据类型byte的溢出问题 问题源于:https://www.cnblogs.com/HuoHua2020/p/12326631.html 定义两个byte类型的数据,将其之和赋值给一个 ...
- 010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二——变量类型——即Java中的数据类型
010 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 04 变量的三个元素的详细介绍之二--变量类型--即Java中的数据类型 Java中变量的三要素 变量名 变 ...
- 零基础学习java------day2------关键字、标志符、常量、进制键的转换、java中的数据类型、强制类型转换的格式
今日内容要求: 1. 了解关键字的概念及特点,了解保留字 2. 熟练掌握标识符的含义,特点,可使用字符及注意事项 3. 了解常量的概念,进制,进制之间相互转换,了解有符号标识法的运算方式 4. 掌握变 ...
- Java内存管理-你真的理解Java中的数据类型吗(十)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 作为Java程序员,Java 的数据类型这个是一定要知道的! 但是不管是那种数据类型最 ...
- Java中基本数据类型的对比记忆
Java中八种基本类型数据情况: 数据类型 所占字节数 所占位数(二进制位数) 可表示范围 默认值 包装类 备注 byte(字节) 1 8 -128 - 127 0 Byte short(短整 ...
随机推荐
- zz1998_Efficient Backprop笔记
1998_Efficient Backprop笔记 A few practical tricks 1. Stochastic vs Batch learning 在最小值附近震荡的幅度与学习速率成比例 ...
- VNC远程登陆树莓派3(包括开机启动)
在树莓派上安装VNC需要使用命令行.如果需要远程操作安装VNC,就必须通过SSH登录到命令行界面(Raspbian的默认用户名是:pi,默认密码是:raspberry). 安装 命令行输入: sudo ...
- react服务端渲染框架
客户端渲染 加载一个空的html页面,然后请求一个打包的js文件,然后再客户端执行这个js文件 动态生成html内容然后插入到DOM元素上,在源代码查询中也只能看到空的html文档 没有任何其他内容 ...
- [LeetCode] 7. Reverse Integer 翻转整数
Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: 321 Examp ...
- ACE网络编程:IPC SAP、ACE_SOCKET和TCP/IP通信实例
socket.TLI.STREAM管道和FIFO为访问局部和全局IPC机制提供广泛的接口.但是,有许多问题与这些不统一的接口有关联.比如类型安全的缺乏和多维度的复杂性会导致成问题的和易错的编程.ACE ...
- c语言线程中传输多个参数
前言:c语言中创建一条线程,但是需要传送多个参数给线程的话我们自然会想到通过传送数组或者结构体来实现,下面我们来看看如何在创建线程的时候传送结构体和数组. #include <stdio.h&g ...
- 容错框架之Hystrix小记
微服务框架下,一个服务依赖于很多服务.在高并发访问下,系统所依赖的服务的稳定性对系统的影响非常大,依赖有很多不可控的因素,比如网络连接变慢,资源突然繁忙,暂时不可用,服务脱机等,一个被调用服务出问题可 ...
- [LeetCode] 847. Shortest Path Visiting All Nodes 访问所有结点的最短路径
An undirected, connected graph of N nodes (labeled 0, 1, 2, ..., N-1) is given as graph. graph.lengt ...
- 推荐一款手机清理工具App悟空清理
推荐一款手机清理工具App悟空清理 1 介绍 悟空清理是一款完全免费的手机加速与存储空间清理工具软件,强力去除顽固垃圾,使手机运行更畅快. 2 特色功能介绍 悟空在手,清理无忧!悟空清理,人人都在用的 ...
- Qt Quick 组件与动态对象
博客24## 一.Components(组件) Component 是由 Qt 框架或开发者封装好的.只暴露了必要接口的 QML 类型,可以重复利用.一个 QML 组件就像一个黑盒子,它通过属性.信号 ...