先看下面的例子:
public class Test
{
public static void main(String[] args)
{
double sum=0;
double temp=0.38;
for(int i=0;i<10;i++)
{
sum=sum+temp;
System.out.println("sum:"+sum);
System.out.println(sum);
}
}
}
程序运行后打印出下面的结果:
sum:0.38
0.38
sum:0.76
0.76
sum:1.1400000000000001
1.1400000000000001
sum:1.52
1.52
sum:1.9
1.9
sum:2.28
2.28
sum:2.6599999999999997
2.6599999999999997
sum:3.0399999999999996
3.0399999999999996
sum:3.4199999999999995
3.4199999999999995
sum:3.7999999999999994
3.7999999999999994
这并不是我们需要的结果,为啥会这样呢?
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。
这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。
在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。
public class Test
{
public static void main(String[] args)
{
double sum=0;
double temp=0.38;
for(int i=0;i<10;i++)
{
BigDecimal b1=new BigDecimal(Double.toString(sum));
BigDecimal b2=new BigDecimal(Double.toString(temp));
sum=b1.add(b2).doubleValue(); }
System.out.println("sum"+sum);
}
}
sum:0.38
sum:0.76
sum:1.14
sum:1.52
sum:1.9
sum:2.28
sum:2.66
sum:3.04
sum:3.42
sum:3.8
分享到:
相关推荐
今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱。以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把...
1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci 数列 ...............................................................................
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... ...
cout加法计算\n"最少输入两个复数,并且以0结束\n"; cout第一个复数:"; cin>>num1; cout第二个复数:"; cin>>num2; sum=num1+num2; cout第三个复数:"; cin>>num1; int i=4; while(!(num1==Zero)) { sum=sum+num1; cout...
你需要创建一个对话框,从对话框获得待定方阵的阶n,然后向matlab传递这个n,并从matlab处获得这个n*n的矩阵数据,最后以矩阵形式显示在窗口中。 输入矩阵没有限定大小,不能采用静态数组来实现,需要使用动态数组...
沿着A的每一维计算总和用指定标量dim,dim是一个从1到N的整数值,其中N是A的维数。dim为1就是计算A的每一列的总和,2计算A的每一行的总和,以此类推。 B = sum和B = sum 在双精度下执行相加求和,返回double类型的...
//用来保存double型数据的中间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 String copy; //做复制用 JTextArea help; //帮助 ...
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class lianxi01 { ...
//printf("两数相加结果:\n%s\n",(n1+n2).ToString()); printf("两数相减结果:\n%s\n",(n1-n2).ToString()); //printf("两数相乘结果:\n%s\n",(n1*n2).ToString()); printf("两数相除结果:\n%s\n",(n1/n2)....
#include #include struct four { double a; struct four *next;...=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }
注意:两个 byte 数相加,变 int 型) short 16bit, -2^15~2^15-1 (2^15=32768) int 32bit, -2^31~2^31-1 (2147483648,20亿,10位有效数字) long 64bit, -2^63~2^63-1 (900亿亿,20位有效数字) float 32bit, 9...
//用来保存double型数据的中间值(vard)和最后结果(answerd) short key = -1, prekey = -1; //key用来保存当前进行何种运算,prekey用来保存前次进行何种运算 boolean clear = false; String copy; //做复制...
12、输入一个数据n,计算斐波那契数列(Fibonacci)的第n个值 1 1 2 3 5 8 13 21 34 规律:一个数等于前两个数之和 //计算斐波那契数列(Fibonacci)的第n个值 public class Fibonacci{ public static void main...
diaoyong(int a,double e,double f) { printf("请输入你要输入的元素(1-4):\n"); scanf("%d",&a); printf("请输入你要相加的两个元素:\n"); scanf("%lf%lf",&e,&f);
C 第二章: 数据类型、运算符、...例如,在前面各例题printf函数的格式串中用到的“\n”就是一个转义字符,其意义是“回车换行”。转义字符主要用来表示那些用一般字符不便于表示的控制代码。 常用的转义字符及其含义...
//重载+运算符,矩阵相加 CMatrix& operator+=(const CMatrix &);//重载+=运算符 CMatrix operator-(const CMatrix &)const;//重载- CMatrix& operator-=(const CMatrix &);//重载-=运算符 BOOL operator==...
例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 import java.util.*; public class lianxi08 { public static void main(String[] args) { long a , b = 0, sum = 0; Scanner s = new ...
//重载+运算符,矩阵相加 CMatrix& operator+=(const CMatrix &);//重载+=运算符 CMatrix operator-(const CMatrix &)const;//重载- CMatrix& operator-=(const CMatrix &);//重载-=运算符 BOOL operator==...
知道struct的sizeof不是成员类型大小的简单相加,对”对界”问题搞的不是很明白,请高手详细解答一下。 struct A { int a; char b; double c; }; sizeof(A)=? 还有利用#pragma pack设置对齐方式是怎么回事? 字串9
#include #include struct four { double a; struct four *next;...=NULL) //各个节点数值相加的结果,有优先级符号的已经先计算了. { s=s+(p->a); p=p->next; } return s; //返回运算结果. }