我们先来看一段代码

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 型 产生的精度问题相关推荐

  1. Java黑皮书课后题第2章:*2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值

    *2.22(金融应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题.以整数值作为输入,其最后两位代表的是美分币值 题目 题目概述 举例 程序清单2-10 修改思路 ...

  2. java double相减_完美解决java double数相加和相减的方案

    我就废话不多说了,大家还是直接看代码吧~ /** * double的计算不精确,会有类似0.0000000000000002的误差,正确的方法是使用BigDecimal或者用整型 * 整型地方法适合于 ...

  3. Java 中的 int 型转为 long 型

    先将 int 型转为 String 型,然后再将 String 转为 long 型,如下图: public class TestIntToLong {public static void main(S ...

  4. Java *2.22(财务应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值。例如:1156就表示11美元56美分。

    2-10 示例学习:整钱总零  要点提示:本节展示一个程序,将一个大额的钱分成较小货币单位.      假如你希望开发一个程序,将给定的钱数分成较小的货币单位.这个程序要求客户输入一个double型的 ...

  5. Java ArrayList转int型数组

    很多ArrayList转数组的例子都是转String类型的数组 方法有两种 Object[] array = arraylist.toArray(); String[] array = arrayli ...

  6. Java Double类型精确运算解决

    Java中的简单浮点数类型float和double不能够进行运算. 首先我们想到的是四舍五入,Math类中的round方法不能设置保留几位小数,我们只能像这样(例如保留两位) Math.round(v ...

  7. java 二进制最大值_java int型最大值/最小值,最大值+1,最小值-1

    java中,int型变量是有符号整形变量.int型变量占用4个字节(32bit位). int型变量采用补码形式来表示数值.对于一个二进制数,正数的补码是其本身,负数的补码是所有二进制位取反再加一. i ...

  8. double转换成int java,Java将double转换为int

    本文概述 我们可以使用类型转换在Java中将double转换为int.要将double数据类型转换为int, 我们需要执行类型转换. Java中的类型转换通过类型转换运算符(数据类型)执行. 在这里, ...

  9. java数据类型(整型、浮点型、char类型、boolean型、类型转换)

    文章目录 0.思维导图总览 1.整型 2.浮点型 3.char型 4.boolean型 5.java内置常量对应数据类型的取值范围 6.数据类型默认值 7.数值类型之间的转换 (1)定义数据类型后自动 ...

最新文章

  1. SEO之网站页面优化策略
  2. oracle学习 sql基本语法(三),Oracle数据库学习三
  3. 赛门铁克公布Q3财报 亏损68亿美元
  4. sklearn学习(二)
  5. python有哪些插件_Python和它高大上的插件们
  6. js控制每行输出2个LI隔行换色
  7. Win7如何设置多个IP地址
  8. 新版本秒级自动部署,K8S才是永远的容器之神!
  9. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized
  10. Git 操作笔记/pip换源
  11. 举例说明语言接触会造成哪些结果_语言学概论全真模拟演练(二)
  12. 环保牵手大数据 佛企需反向挖掘数据价值
  13. hackbar 使用教程_hackbar简单安装使用教程
  14. 《Java技术》第四次作业
  15. 基于springboot+vue的公益慈善捐助网站(前后端分离)
  16. Linux vip地址通信原理,IPv6的组播地址(掌握IPv6通信原理的关键知识点)
  17. android 定时开关机,android 定时关机
  18. day09、1 - 简单渗透测试流程
  19. [PMP] 什么是从众效应
  20. 虚拟汽车加油问题 (贪心算法)

热门文章

  1. SSL,HTTPS,数字证书 是什么?
  2. 基于ASAM ODS标准的试验数字化平台-WDP
  3. Dynamics 365 设置SMTP邮箱配置时凭据为灰色无法编辑的解决方法
  4. 阿里云centos下载地址
  5. 蓝桥杯及其搜索算法总结
  6. 从实际问题看 SwiftUI 和 Widget 编程
  7. Java---多线程入门
  8. 国务院智囊建议全面放开二胎:越晚越被动
  9. 如何将音乐添加到PowerPoint演示文稿
  10. Petya and Countryside