double类型的乘法问题

lvyulily 2015-07-22 10:55:18
比如求圆的面积,半径用double数据类型,乘出来的结果让我困惑。代码如下:
public class TestDouble {
public static void main(String[] args){

for(double i=1.0;i<=10.0;i++){
System.out.println(3.14*i*i);
}

}
结果如下:
3.14
12.56
28.259999999999998
50.24
78.5
113.03999999999999
153.86
200.96
254.34
314.0

不懂为什么在i=3和6的时候结果会是这样?
...全文
1039 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmbc48 2015-07-25
  • 打赏
  • 举报
回复

public static void main(String[] args) {

		for (double i = 1.0; i <= 10.0; i++) {
			double d = 3.14*i*i;
			 BigDecimal bd = new BigDecimal(d);  
	         System.out.println(bd.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());  
	         System.out.println("=================");  
	         DecimalFormat df = new DecimalFormat("#.00");   
	         System.out.println(df.format(d));   
	         System.out.println("=================");  
	         System.out.println(String.format("%.2f", d));  
	         System.out.println("=================");  
	         NumberFormat nf = NumberFormat.getNumberInstance();   
	         nf.setMaximumFractionDigits(2);   
	         System.out.println(nf.format(d));  
		}
zmbc48 2015-07-25
  • 打赏
  • 举报
回复

public class TestDouble {
	public static void main(String[] args) {

		for (double i = 1.0; i <= 10.0; i++) {
			double d = 3.14*i*i;
			System.out.println(String.format("%.2f", d));
		}

	}
}
这样可能会好看一点。呵呵!!有一个编程强迫症啊!!!
cc_hw 2015-07-25
  • 打赏
  • 举报
回复
java 的double,float 使用的是浮点计算,比如说0.1 用科学计算方法 可能就是 0.09999999999999999 来表示,计算时就会存在误差 可以使用BigDecimal
public static void main(String[] args) {
	
		BigDecimal Pi=new BigDecimal(3.14);//用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数
		
		for(double i=1.0;i<=10.0;i++){
			
			BigDecimal num=new BigDecimal(i);
			
			System.out.println(num.multiply(num.multiply(Pi)).doubleValue());//两次相乘再转换成double
		}
	}
ZTzhubajie 2015-07-24
  • 打赏
  • 举报
回复
这叫舍入误差
lvyulily 2015-07-24
  • 打赏
  • 举报
回复
引用 10 楼 cricel 的回复:
刚刚试着全部换算成2进制计算了下,但是算了10几分钟后我还是放弃了,,虽然没算完,但是如果想说为什么在3和6的时候会不精确,可能是因为转换成2进制后*3*3和*6*6的2进制小数点第N个位上的数字无法达到四舍五入的那个值,所以就造成类似于28.259999999999998这样的数了
和我想的差不多,但是我想不是四舍五入,因为double类型存储的时候是用52位来表示尾数的,应该是第53位决定了是否舍或是入,可能是大于2^-53就入?而且数值越大,小数部分的精度也会越低。
lvyulily 2015-07-23
  • 打赏
  • 举报
回复
引用 5 楼 longtian1213 的回复:
浮点数都这样,不精确
为什么只是在i=3.0和6.0时不精确?
lvyulily 2015-07-23
  • 打赏
  • 举报
回复
有的说不精确,但是这种不精确为什么只在i=3.0和6.0的时候出现呢?我想可能是存储的问题,但是没有想出来具体原因
lvyulily 2015-07-23
  • 打赏
  • 举报
回复
引用 4 楼 jcrs523 的回复:
就和十进制1除以3除不尽一样的道理,那里二进制的东西
那为什么偏偏在i=3和6的时候不精确,其他时候挺精确的?
cricel 2015-07-23
  • 打赏
  • 举报
回复
刚刚试着全部换算成2进制计算了下,但是算了10几分钟后我还是放弃了,,虽然没算完,但是如果想说为什么在3和6的时候会不精确,可能是因为转换成2进制后*3*3和*6*6的2进制小数点第N个位上的数字无法达到四舍五入的那个值,所以就造成类似于28.259999999999998这样的数了
jcrs523 2015-07-22
  • 打赏
  • 举报
回复
就和十进制1除以3除不尽一样的道理,那里二进制的东西
youshu2011 2015-07-22
  • 打赏
  • 举报
回复
因为 float 和 double 不能精确的表达 0.1 ,或者任何 10 的负 n 次方。他们是设计来进行科学和工程上的计算,提供精确的近似值的。 用 BigDecimal , int 或者 long 。
三仙半 2015-07-22
  • 打赏
  • 举报
回复
用二进制表示十进制的小数会有一些误差,更详细的内容你可以去百度一下数字在计算机中的存储。
tony4geek 2015-07-22
  • 打赏
  • 举报
回复
shiyi_xie 2015-07-22
  • 打赏
  • 举报
回复
循环变量用double。。。。
S117 2015-07-22
  • 打赏
  • 举报
回复
浮点数都这样,不精确

62,635

社区成员

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

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