前段时候写了一个对外提供的接口,其中有一个数值校验的计算。在测试的过程中发现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 数值类型以及计算的更多相关文章

  1. Java数值类型之间转换

    Java之间的数值转换如图所示,实心箭头代表无数据丢失,虚线箭头代表可能丢失 例如:123456789是一个大的整数,包含的位数比float类型能够表达的位数多,但这个数转换为float类型时,将会得 ...

  2. PHP中字符串类型与数值类型混合计算

    字符串转数值的规则 当一个字符串被当作一个数值来取值,其结果和类型如下: 如果该字符串没有包含 '.','e' 或 'E' 并且其数字值在整型的范围之内(由 PHP_INT_MAX 所定义),该字符串 ...

  3. Java数值避免浮点型计算丢失精度问题

    问题描述及方案 假设我们在做电商项目,在进行计算时这个丢失精度在产品价格计算就会出现问题,很有可能造成我们手里有9.99元然后后面会有一堆9,但是呢这些钱无法购买一个10元的商品. 在某些编程语言中有 ...

  4. java数值类型之间的转换

    说明:图中6个实心箭头代表转换无信息丢失,3个虚线箭头表示可能有精度损失的转换.

  5. Java枚举类型的使用,数值的二进制表示

    一.Java枚举类型的使用 首先请看这段代码: package java上课; public class EnumTest { public static void main(String[] arg ...

  6. java浮点类型计算

    java浮点类型需要采用java.math.*这个工具包,这样的计算结果才是我们想要的.呵呵 import java.math.BigDecimal; import java.text.NumberF ...

  7. Java中初级数值类型的大小, volatile和包装类wrapped type的比较

    Java中的初级数值类型 Java是静态类型语言, 所有的变量必须先声明再使用. 其初级类型一共8种: boolean: 数据只包含1bit信息, 但是占空间为8-bit, 默认值为false byt ...

  8. java double类型保留两位小数4种方法【转】

    4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberF ...

  9. Java基础类型与其二进制表示

    Java中的基础类型有:byte.short.int.long.float.double.char和boolean. 它们可被分为四种类型,整型.浮点型.char型和boolean型. 整型:byte ...

随机推荐

  1. Html在网页、页面中放置Swf、Flash 背景

    Html 在网页.页面中放置Swf.Flash背景: <embed src="image/index.swf" wmode=transparent style="p ...

  2. 内存快照排查OOM,加密时错误方法指定provider方式错误引起的OOM

    写在前面: 最近开始总结内存方面的东西,已经总结以前遇到的一些内存案例分享下,接下来还有几篇,然后是进程/线程相关的,逐渐形成我的知识体系树 如果你有兴趣,可以文章末尾的公众号二维码一起梳理这些信息. ...

  3. Java: 分解List<HashMap<String, String>>

    分解List<HashMap<String, String>> 的方法: List<HashMap<String, String>> mapList; ...

  4. 在Windows 10 Anniversary下配置Caffe

    去年十月份的时候尝试过配置caffe,真的是恶心到家,当时用的还是微软魔改的基于NuGet的caffe.现在这个项目退役了,接手的是原项目下的windows分支,虽然并不是很成熟,但是依然非常推荐在W ...

  5. linux命令行模式下对FTP服务器进行文件上传下载

    参考源:点击这里查看   1. 连接ftp服务器 格式:ftp [hostname| ip-address]a)在linux命令行下输入: ftp 192.168.1.1 b)服务器询问你用户名和密码 ...

  6. MongoDB基础之六 索引

    一 . 索引概述和基本操作 1. 索引提高查询速度,降低写入速度,权衡常用的查询字段,不必在太多列上建索引2. 在mongodb中,索引可以按字段升序/降序来创建,便于排序3. 默认是用btree来组 ...

  7. C语言memset学习

    #include <stdio.h> #include <memory.h> ]); //函数声明 void main(){ ]={{,,},{,,},{,,},{,,}};/ ...

  8. js与android webview交互

    0x01 js调用java代码 android webview中支持通过添加js接口 webview.addJavascriptInterface(new JsInteration(), " ...

  9. IP查询接口1

    新浪的:http://counter.sina.com.cn/ip?ip=IP地址返回Js数据,感觉不是很精确,可以把问号后面的去掉,直接返回本机对应的IP所在地http://www.yodao.co ...

  10. use vue vuex vue-router, not use webpack

    vue,vuex,vue-router放在一起能做什么?不用webpack之类的打包工具使用他们是否可行?各位道友在初学vue时是否有这样的困惑.因为现代构建前端项目的一般模式是: 安装webapck ...