Java float的精度问题
来源:互联网 发布:excel的数据分析工具 编辑:程序博客网 时间:2024/05/14 13:41
1、问题描述
进行计算器项目时,对于小数的减法出现了精度问题。之前float的精度问题是有了解的,现在既然在运用中出现了,那就把解决掉吧。当我们输入2.2 - 2.0时,得到的结果会是0.20000005,这肯定是我们不希望看到的。
2、问题分析
为什么会出现这样的情况了?
请参考文章:http://www.blogjava.net/jelver/articles/340038.html
具体的我也解释不清楚,一个可能的原因是和计算机中存储float类型的方式有关吧。好比我们要去求1/3的结果一样,只可能得到一个近似值。
我参考的文章中提到了一个解决方法,通过BigDecimal 类;通过百度后,知道它是用来进行大数字操作的类,而且可以解决浮点数精度的问题。同时还有一个处理整数的BinInteger类。详细说明读者可以进一步阅读:
http://blog.sina.com.cn/s/blog_6a0cd5e501011soa.html
http://jeelee.iteye.com/blog/652003
3、具体的代码
//之前的计算形式float a = 2.2f;float b = 2.0f;float c = a - b;//改变成以下的写法BigDecimal a1 = new BigDecimal(Float.toString(a));BigDecimal b1 = new BigDecimal(Float.toString(b));float c1 = a1.subtract(b1).floatValue();
以下代码转载自:http://blog.sina.com.cn/s/blog_6a0cd5e501011soa.html
</pre><pre name="code" class="java">
package org.lxh.demo11.numberdemo;import java.math.BigDecimal;class MyMath { public static double add(double d1, double d2){ // 进行加法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.add(b2).doubleValue(); } public static double sub(double d1, double d2){ // 进行减法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.subtract(b2).doubleValue(); } public static double mul(double d1, double d2){ // 进行乘法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.multiply(b2).doubleValue(); } public static double div(double d1,double d2,int len) {// 进行除法运算 BigDecimal b1 = new BigDecimal(d1); BigDecimal b2 = new BigDecimal(d2); return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue(); } public static double round(double d,int len) { // 进行四舍五入操作 BigDecimal b1 = new BigDecimal(d); BigDecimal b2 = new BigDecimal(1); // 任何一个数字除以1都是原数字 // ROUND_HALF_UP是BigDecimal的一个常量,表示进行四舍五入的操作 return b1.divide(b2, len,BigDecimal.ROUND_HALF_UP).doubleValue(); }}public class BigDecimalDemo01 { public static void main(String[] args) { System.out.println("加法运算:" +MyMath.round(MyMath.add(10.345,3.333), 1)); System.out.println("乘法运算:" +MyMath.round(MyMath.mul(10.345,3.333), 3)); System.out.println("除法运算:" +MyMath.div(10.345, 3.333, 3)); System.out.println("减法运算:" +MyMath.round(MyMath.sub(10.345,3.333), 3)); }}
0 0
- Java float的精度问题
- java中float,double的精度问题
- float的精度问题
- float丢失精度的问题
- C++的float精度问题
- 关于java中float运算的精度问题
- java解决double和float精度不准确的问题
- Java float精度计算的问题,截取小数点后两位
- Java float精度计算的问题,截取小数点后两位
- java float double精度为什么会丢失?浅谈java的浮点数精度问题
- java float double精度为什么会丢失?浅谈java的浮点数精度问题
- java float double精度为什么会丢失?浅谈java的浮点数精度问题
- java float和double精度问题
- java float计算精度丢失问题剖析
- java int转float精度丢失问题
- 关于float和double的精度问题
- float和double的精度问题
- 关于float, double的精度问题
- How to create a Maven web app and deploy to Tomcat - fast
- 3Sum Closest
- 关于sqlDataReader的问题
- firefox 中vim模式的操作--放弃鼠标
- Java中Comparable和Comparator
- Java float的精度问题
- [Sigcom13]Developing a Predictive Model ofQuality of Experience for Internet Video
- JavaWeb——Day17_1
- POJ 3132 & ZOJ 2822 Sum of Different Primes(dp)
- CSS之盒子模型与面向对象
- iOS MDM知识介绍
- Android开源项目链接
- Eclipse ADT 插件安装慢的解决办法
- addView(View, LayoutParams) is not supported in AdapterView