java计算小数有点问题,求高手帮助

jtbreeze 2012-11-30 07:04:03
今天写程序,偶然发现一个问题,感觉很奇怪,请看代码:
public class FloatTest {

public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("result is "+((float)1/15 + (float)1/10 + (float)1/3 + (float)1/2));
System.out.println("result is "+((float)1/2 + (float)1/3 + (float)1/10 + (float)1/15));
}

}


运行结果如下:
result is 1.0
result is 1.0000001

我现在需要对结果进行判断,所有需要结果的精确性。
这个问题原因是什么,如何解决? 谢谢!
...全文
363 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jtbreeze 2012-12-01
  • 打赏
  • 举报
回复
引用 5 楼 zhaoming262350 的回复:
这样实现就行了: import java.math.BigDecimal; class MyMath { public static double add(double d1, double d2) { // 进行加法运算 BigDecimal b1 = new BigDecimal(d1); Bi……
这个方法,但是我只要判定 1/a+1/b+1/c+1/d的结果是否恰好等于1~ 而且要循环好几千次去检测,这样时间和空间复杂度会不会增加
jtbreeze 2012-12-01
  • 打赏
  • 举报
回复
引用 4 楼 muyu1016 的回复:
《编写高质量代码:改善Java程序的151个建议》中的例子。不知道能不能帮上你。 public class Test { public static void main(String [] args){ System.out.println(10.00-9.60); NumberFormat f=new DecimalFormat("#.##"); Syst……
这么一说,我明白了,知识点都搞忘了~谢谢~
jtbreeze 2012-12-01
  • 打赏
  • 举报
回复
引用 1 楼 ldh911 的回复:
二进制计算精度上的固有问题,可以考虑计算时用double加强精度控制,输出时再进行四舍五入之类的格式控制。 毕竟绝大多数程序语言并不支持“符号运算”,必然会碰到精度的问题,所以没法杜绝此类问题。 除非你用专用的数值计算软件,比如Matlab之类的。
嗯,大概知道为什么了,谢谢!
oNianGao 2012-12-01
  • 打赏
  • 举报
回复
public class FloatTest { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("result is "+((float)1/15 + (float)1/10 + (float)1/3 + (float)1/2)); System.out.println("http://www.niuwanet.com/")); System.out.println("result is "+((float)1/2 + (float)1/3 + (float)1/10 + (float)1/15)); }
zhaoming262350 2012-11-30
  • 打赏
  • 举报
回复
这样实现就行了: 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)); } }
禺沫 2012-11-30
  • 打赏
  • 举报
回复
《编写高质量代码:改善Java程序的151个建议》中的例子。不知道能不能帮上你。 public class Test { public static void main(String [] args){ System.out.println(10.00-9.60); NumberFormat f=new DecimalFormat("#.##"); System.out.println(f.format(10.00-9.60)); } } /*** * 这是因为在计算机中浮点数有可能(注意是可能)是不准确的,它只能无限接近准确值,而不能完全精确。 * 这是由浮点数的存储规则所决定的,我们先来看0.4这个十进制小数如何转化成二进制小数, * 使用“乘2取整,顺序排列”法,我们发现0.4不能用二进制准确的表示,在二进制世界里它是一个无限循环的小数 * * 解决方案1: * 使用BigDecimal * 解决方案2: * 使用整数,把参与运算的值扩大100倍,然后在展示时再缩小100倍 */
yjq_120 2012-11-30
  • 打赏
  • 举报
回复
试了一下,也没搞没明白,等高手解答
meran 2012-11-30
  • 打赏
  • 举报
回复
BigDecimal类你也可以看看,原因google一下就好或者翻翻组成原理
MiceRice 2012-11-30
  • 打赏
  • 举报
回复
二进制计算精度上的固有问题,可以考虑计算时用double加强精度控制,输出时再进行四舍五入之类的格式控制。 毕竟绝大多数程序语言并不支持“符号运算”,必然会碰到精度的问题,所以没法杜绝此类问题。 除非你用专用的数值计算软件,比如Matlab之类的。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧