Java 数值类型以及计算
前段时候写了一个对外提供的接口,其中有一个数值校验的计算。在测试的过程中发现5.6-1.6 != 4,究其原因是double类型的数值有精度丢失的现象,看来还是基础知识不牢固,在网上找了些文档从头看了下Java基本数值类型,好多东西已经忘记了,什么二进制补码、原码、反码统统忘记了,回想起大学数学.....(越扯越远了)。
基本数据类型和浮点数精度问题引用俩篇现有的博客就不在重复造轮子了,精度问题好像扯得比较多,说实话没看懂,主要写写如何处理精度问题吧。
Java的基本数据类型
引用:http://www.cnblogs.com/1130136248wlxk/articles/5105524.html
Java double 精度问题
引用:https://www.iovi.com/post/2014-07-07-talk-about-double-in-java.html
看了一遍有些没有看懂,但是得出的结论是:double之所以产生精度的丢失,最根本的原因是用于表示小数的二进制位数不够,然后做round,造成丢失。
既然Java的浮点数运算为产生精度问题,那么对于需要精确运算结果的系统如何处理呢?
Effective Java 第48条 如果需要精确的答案,请避免使用flaot和double,flaot和double 主要是为科学计算和工程计算而设计的,如果需要精确计算请使用BigDecimal,不过BigDecimal的性能相比double会下降很多,所以根据实际情况选择合适自己的方式。
//定义数字格式化类
NumberFormat nf = NumberFormat.getInstance();
nf.setGroupingUsed(false);
nf.setMaximumFractionDigits(2);
double ysx = 5.6; 6 double jcx = 1.6;
//将double类型转换为BigDecimal
//必须先将double转换为string
BigDecimal ysx = new BigDecimal(nf.format(ysx);
BigDecimal jcx = new BigDecimal(nf.format(jcx));
//执行计算
BigDecimal ysc= jcx.subtract(ycx)
//比较大小14 //compareTo 只比较数值大小
//equals 比较数值大小以及精度
if(ysc.compareTo(jcx) == 0)
Java 数值类型以及计算的更多相关文章
- Java数值类型之间转换
Java之间的数值转换如图所示,实心箭头代表无数据丢失,虚线箭头代表可能丢失 例如:123456789是一个大的整数,包含的位数比float类型能够表达的位数多,但这个数转换为float类型时,将会得 ...
- PHP中字符串类型与数值类型混合计算
字符串转数值的规则 当一个字符串被当作一个数值来取值,其结果和类型如下: 如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串 ...
- Java数值避免浮点型计算丢失精度问题
问题描述及方案 假设我们在做电商项目,在进行计算时这个丢失精度在产品价格计算就会出现问题,很有可能造成我们手里有9.99元然后后面会有一堆9,但是呢这些钱无法购买一个10元的商品. 在某些编程语言中有 ...
- java数值类型之间的转换
说明:图中6个实心箭头代表转换无信息丢失,3个虚线箭头表示可能有精度损失的转换.
- Java枚举类型的使用,数值的二进制表示
一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...
- java浮点类型计算
java浮点类型需要采用java.math.*这个工具包,这样的计算结果才是我们想要的.呵呵 import java.math.BigDecimal; import java.text.NumberF ...
- Java中初级数值类型的大小, volatile和包装类wrapped type的比较
Java中的初级数值类型 Java是静态类型语言, 所有的变量必须先声明再使用. 其初级类型一共8种: boolean: 数据只包含1bit信息, 但是占空间为8-bit, 默认值为false byt ...
- java double类型保留两位小数4种方法【转】
4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...
- Java基础类型与其二进制表示
Java中的基础类型有:byte.short.int.long.float.double.char和boolean. 它们可被分为四种类型,整型.浮点型.char型和boolean型. 整型:byte ...
随机推荐
- C# Unity游戏开发——Excel中的数据是如何到游戏中的 (二)
本帖是延续的:C# Unity游戏开发——Excel中的数据是如何到游戏中的 (一) 上个帖子主要是讲了如何读取Excel,本帖主要是讲述读取的Excel数据是如何序列化成二进制的,考虑到现在在手游中 ...
- Android学习笔记总结
第一步: Android(1) - 在 Windows 下搭建 Android 开发环境,以及 Hello World 程序 搭建 Android 的开发环境,以及写一个简单的示例程序 · 在 Win ...
- Spring xml中进行autowired的方式
可以在xml文件中进行autowired: xml: <?xml version="1.0" encoding="UTF-8"?> <bean ...
- LinkedHashMap遍历
第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Ma ...
- Bootstrap入门(六)按钮和图片
Bootstrap入门(六)按钮和图片 先引入本地的CSS文件 <link href="css/bootstrap.min.css" rel="styleshe ...
- ubuntu和Deepin下chrome浏览器提示flash下载失败或者过期的解决方案
问题:更新了下Deepin系统,打开chrome发现,视频放不了了,提示flash"下载失败" 谷歌浏览器版本是Version 55.0.2883.87 (64-bit) flas ...
- CentOS 6一键系统优化 Shell 脚本
CentOS 6一键系统优化 Shell 脚本 脚本的内容如下: #!/bin/bash#author suzezhi#this script is only for CentOS 6#check t ...
- HDU5842
Lweb and String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- 创建 vxlan 并部署 instance - 每天5分钟玩转 OpenStack(147)
上一节我们完成了 OVS VxLAN 的配置工作,今天创建 vxlan100_net 并部署 instance. 创建 vxlan100_net 打开菜单 Admin -> Networks,点 ...
- 列存储段消除(ColumnStore Segment Elimination)
列存储索引是好的!对于数据仓库和报表工作量,它们是真正的性能加速器.与聚集列存储结合,你会在常规行存储索引(聚集索引,非聚集索引)上获得巨大的压缩好处.而且创建聚集列存储索引非常简单: CREATE ...