程序算出来的数和计算器算出来的不一样

zszs1018 2012-09-12 09:33:19
public class Constants{
public static void main(String[] args){
final double a = 4.6;
double b = 4.5;
double c = 5.5;
System.out.println("Paper size is centimeters:"+a*b+"by"+a*c);
}
}
程序算出来的数和计算器算出来的不一样,我把a*b,a*c改成b*a,c*a算出来的数又变了
请问下是怎么回事啊?
...全文
851 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
mzy0324 2012-09-22
  • 打赏
  • 举报
回复
用BigDecimal。或者可以尝试在方法上加关键字“strictfp”。据说加了之后虚拟机可以保证精确。
jiakai0419 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

看一下java IEEE 754 的标准吧
[/Quote]

IEEE754就是IEEE754 并不是为某种语言而设计的。
zhaoming262350 2012-09-19
  • 打赏
  • 举报
回复
看一下java IEEE 754 的标准吧
jiakai0419 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 8 楼 的回复:

要精确计算使用BigDecimal

java计算浮点数有bug的,所以如果需要精确计算得用这位兄弟提供的BigDecimal类
[/Quote]

什么叫Java计算浮点数有bug,这种说法很不准确好吗?

无论你用什么语言,二进制就是二进制。

有很多数,计算机就是表示不了。

比如0.2,这个数据算机就是无法准确表示的。因为他不能写成2^x相加的形式。

详细的可以看看IEEE浮点数的标准
杀手 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
要精确计算使用BigDecimal
[/Quote]
+1
ddplayer12 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

要精确计算使用BigDecimal
[/Quote]
java计算浮点数有bug的,所以如果需要精确计算得用这位兄弟提供的BigDecimal类
walkman_22 2012-09-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
public class Constants{
public static void main(String[] args){
final double a = 4.6;
double b = 4.5;
double c = 5.5;
System.out.println("Paper size is centimeters:"+a*b+"by"+a*c);
}
}
程序算出来的数……
[/Quote]

我这里怎么算都是一样的
Jobernowl 2012-09-13
  • 打赏
  • 举报
回复
public class Constants{
public static void main(String[] args){
final double a = 4.6d;
double b = 4.5d;
double c = 5.5d;
System.out.println("Paper size is centimeters:"+(a*b)+"by"+(a*c));
}
}
安特矮油 2012-09-13
  • 打赏
  • 举报
回复
要精确计算使用BigDecimal
蓝蜘蛛 2012-09-13
  • 打赏
  • 举报
回复
计算机运算是使用二进制代码进行相关的计算,所以在很多运算中都会出现误差
用java.math.BigDecimal吧
caoyishuai 2012-09-13
  • 打赏
  • 举报
回复
java中的浮点数类型float和double不能进行运算,遇到有些数据得到的数据不准确。如:3.121-1=3.1209999999998。解决办法如下:


blic class Arith {
private static final int DEF_DIV_SCALE = 10;

/**
* 两个Double数相加
* @param v1
* @param v2
* @return Double
*/
public static Double add(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.add(b2).doubleValue();
}

/**
* 两个Double数相减
* @param v1
* @param v2
* @return Double
*/
public static Double sub(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.subtract(b2).doubleValue();
}

/**
* 两个Double数相乘
* @param v1
* @param v2
* @return Double
*/
public static Double mul(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.multiply(b2).doubleValue();
}

/**
* 两个Double数相除
* @param v1
* @param v2
* @return Double
*/
public static Double div(Double v1,Double v2){
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
}

/**
* 两个Double数相除,并保留scale位小数
* @param v1
* @param v2
* @param scale
* @return Double
*/
public static Double div(Double v1,Double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(v1.toString());
BigDecimal b2 = new BigDecimal(v2.toString());
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
WilliamMoore 2012-09-13
  • 打赏
  • 举报
回复
浮点类型数据计算有精度问题
scobur1 2012-09-13
  • 打赏
  • 举报
回复
浮点数在机器内的表示是不准确的
zh_s_z 2012-09-13
  • 打赏
  • 举报
回复
double b = 4.5D;
wula0010 2012-09-13
  • 打赏
  • 举报
回复
看看java的数据类型float、double、deciaml,你的问题就迎刃而解了......
雪馨 2012-09-13
  • 打赏
  • 举报
回复
在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。

62,614

社区成员

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

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