解决 java double 减 int 型 产生的精度问题
我们先来看一段代码
public class Test_1 {public static void main(String[] args) {String e = "1.01";//这里顺便写下把一个小数分为整数和小数部分double s = Double.valueOf(e);//1.01int in = (int) value;//1System.out.println("The integer is: " + in);//整数部分的值double r = value - in;// 小数部分的值System.out.println("The decimal number is: " + r);}}
大家猜猜看,这个r 的值是多少?你说这不是很简单吗1.01-1不就等于0.01?
事实运行的结果是这样的:
你会发现多了一串东西,你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。
其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
1、用float或者double变量构建BigDecimal对象。2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。3、把BigDecimal对象转换成float,double,int等类型。
我们直接上代码:
BigDecimal b1 = new BigDecimal(e);
BigDecimal b2 = new BigDecimal(num1);
System.out.println(b1.subtract(b2).doubleValue());
结果就如我们心意了。1.01-1=0.01.
也许有的人会注意到我们的变量e不是String类型吗?为什么不是double型?
这里有个陷阱,当你使用new BigDecimal(Double d) 时,得到的BigDecimal中的long值并不是精确,详情可查源码,可追溯到native long doubleToRawLongBits(double value);
这时使用new BigDecimal(String s)得到的即准确值,用于计算不会出现误差,有心人可以去试试。
一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。
1 BigDecimal b1 = new BigDecimal(Double.toString(0.48));
2 BigDecimal b2 = BigDecimal.valueOf(0.48);
对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。
1 public BigDecimal add(BigDecimal value); //加法
2 public BigDecimal subtract(BigDecimal value); //减法
3 public BigDecimal multiply(BigDecimal value); //乘法
4 public BigDecimal divide(BigDecimal value); //除法
参考文章:http://www.cnblogs.com/chenssy/archive/2012/09/09/2677279.html
解决 java double 减 int 型 产生的精度问题相关推荐
- Java黑皮书课后题第2章:*2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值
*2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题.以整数值作为输入,其最后两位代表的是美分币值 题目 题目概述 举例 程序清单2-10 修改思路 ...
- java double相减_完美解决java double数相加和相减的方案
我就废话不多说了,大家还是直接看代码吧~ /** * double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型 * 整型地方法适合于 ...
- Java 中的 int 型转为 long 型
先将 int 型转为 String 型,然后再将 String 转为 long 型,如下图: public class TestIntToLong {public static void main(S ...
- Java *2.22(财务应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值。例如:1156就表示11美元56美分。
2-10 示例学习:整钱总零 要点提示:本节展示一个程序,将一个大额的钱分成较小货币单位. 假如你希望开发一个程序,将给定的钱数分成较小的货币单位.这个程序要求客户输入一个double型的 ...
- Java ArrayList转int型数组
很多ArrayList转数组的例子都是转String类型的数组 方法有两种 Object[] array = arraylist.toArray(); String[] array = arrayli ...
- Java Double类型精确运算解决
Java中的简单浮点数类型float和double不能够进行运算. 首先我们想到的是四舍五入,Math类中的round方法不能设置保留几位小数,我们只能像这样(例如保留两位) Math.round(v ...
- java 二进制最大值_java int型最大值/最小值,最大值+1,最小值-1
java中,int型变量是有符号整形变量.int型变量占用4个字节(32bit位). int型变量采用补码形式来表示数值.对于一个二进制数,正数的补码是其本身,负数的补码是所有二进制位取反再加一. i ...
- double转换成int java,Java将double转换为int
本文概述 我们可以使用类型转换在Java中将double转换为int.要将double数据类型转换为int, 我们需要执行类型转换. Java中的类型转换通过类型转换运算符(数据类型)执行. 在这里, ...
- java数据类型(整型、浮点型、char类型、boolean型、类型转换)
文章目录 0.思维导图总览 1.整型 2.浮点型 3.char型 4.boolean型 5.java内置常量对应数据类型的取值范围 6.数据类型默认值 7.数值类型之间的转换 (1)定义数据类型后自动 ...
最新文章
- SEO之网站页面优化策略
- oracle学习 sql基本语法(三),Oracle数据库学习三
- 赛门铁克公布Q3财报 亏损68亿美元
- sklearn学习(二)
- python有哪些插件_Python和它高大上的插件们
- js控制每行输出2个LI隔行换色
- Win7如何设置多个IP地址
- 新版本秒级自动部署,K8S才是永远的容器之神!
- This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized
- Git 操作笔记/pip换源
- 举例说明语言接触会造成哪些结果_语言学概论全真模拟演练(二)
- 环保牵手大数据 佛企需反向挖掘数据价值
- hackbar 使用教程_hackbar简单安装使用教程
- 《Java技术》第四次作业
- 基于springboot+vue的公益慈善捐助网站(前后端分离)
- Linux vip地址通信原理,IPv6的组播地址(掌握IPv6通信原理的关键知识点)
- android 定时开关机,android 定时关机
- day09、1 - 简单渗透测试流程
- [PMP] 什么是从众效应
- 虚拟汽车加油问题 (贪心算法)