`
8366
  • 浏览: 810255 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

n 个double相加的问题

阅读更多

 

先看下面的例子:

 

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

 

 

 

分享到:
评论
2 楼 haiyangyiba 2012-08-21  
不知为何?
最关键的代码在这里:BigDecimal b1=new BigDecimal(Double.toString(sum));
这句中的 Double.toString(sum);这里
1 楼 liangwenzheng 2008-11-18  
learning~

相关推荐

    程序中两个Double类型相加出现误差的解决办法

    今天在自己做的系统中,发现了一个奇怪的现象:几个Double类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱。以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把...

    邮局选址问题 给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。

    为了解决这个问题,我们首先需要理解曼哈顿距离的特性。曼哈顿距离是一种特殊的距离度量方法,它计算的是两个点在坐标轴上的投影距离之和。因此,对于每一个维度(x坐标或y坐标),我们需要找到一个最佳的位置,使得...

    double数据类型

    为了解决这一问题,可以使用两个`double`变量来构建一个名为`doubledouble`的结构。该结构能够提供比单一`double`类型更高的精度,达到大约30位有效数字的水平。这种方法通过组合两个`double`值来表示一个更大的数值...

    c++程序代码一些数字相加代码

    我们声明了一个double类型的变量points,并将其输入。然后,我们使用switch语句来判断等级,并将结果输出。 知识点: * 开关语句的使用 * 变量声明和赋值 例6:辗转相除法-求最大公约数 在这个例子中,我们使用...

    向量相加C程序

    - `double* Add(double* x, double* y, int size)`:该函数接收两个双精度浮点数数组的指针及数组的大小作为参数,返回两个数组对应元素相加的结果数组。 - `void main()`:主函数,程序的入口点,负责调用其他...

    多项式相加 java链表实现

    这个过程通常涉及嵌套循环,时间复杂度为O(n^2),其中n是两个多项式项的总数。由于这部分代码在给定的部分内容中没有直接给出,所以在这里不进行详细展开,但可以理解为一个类似于多项式相加的扩展过程,只是乘法...

    一元多项式相加减 一元多项式相加减 运行程序 源程序

    + cx^2 + dx + e \),其中 \( a, b, ..., d, e \) 是系数,\( x \) 是变量,\( n \) 是一个非负整数。一元多项式的加减操作相对简单,遵循基本的代数规则:同类项相加减。 在给定的标题和描述中,我们关注的是如何...

    C语言版数据结构课设--多项式相加

    `Addpolyn`函数实现了两个多项式的相加操作,其核心在于遍历两个链表,比较每个节点的指数大小,进行相应的合并操作。如果两个多项式的某项指数相同,则将对应的系数相加;如果不同,则将较小指数的项直接添加到结果...

    用C语言实现复数相加和相乘

    printf("%g + %gi\n", c.real, c.imag); } Complex inputComplex() { Complex c; printf("请输入复数(形式:实部+虚部i):"); scanf("%lf%*c%lf", &c.real, &c.imag); return c; } ``` 最后,我们可以编写...

    C矩阵类实现转置,相乘,相加,求逆.doc

    矩阵的相加操作可以通过创建一个新的矩阵,并将两个矩阵的元素逐个相加实现。 6. 矩阵的相乘操作 矩阵的相乘是将两个矩阵的元素逐个相乘的操作。例如,如果两个矩阵的大小分别是m*n和n*p,那么它们的乘积矩阵的...

    c++实验报告一

    否则,它会递归地调用自身来计算F(n-1)和F(n-2),然后将它们相加得到F(n)。 在进行实验时,需要注意递归可能导致栈溢出,因为每次函数调用都会在内存栈上分配空间。对于较大的n值,你可能需要考虑使用非递归方法,...

    按以下描述和要求建立两个类:基类 Rectangle(矩形类) 和派生类 Cube(正方体)

    在这个编程任务中,我们需要创建两个类,一个基类 `Rectangle` 表示矩形,一个派生类 `Cube` 表示正方体。以下是详细的知识点解释: 1. **基类 Rectangle** - `Rectangle` 类有四个私有成员变量 `x1`, `y1`, `x2`,...

    世界500强面试题.pdf

    1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci 数列 ...............................................................................

    N!的位数

    通过循环遍历1到N的所有整数,并利用`log10()`函数计算每个整数的对数值,最后将所有对数值相加得到结果。通过取整并加1得到N!的位数,并打印输出。 ### 总结 本文介绍了一种简单有效的方法来计算N!的位数,该方法...

    C语言程序改错题[参考].pdf

    double fun (int n) { int a, b, c, k; double s; s = 0.0; a = 2; b = 1; for (k = 1; k &lt;= n; k++) { s = s + (double)a / b; c = a; a = a + b; b = c; } return s; } ``` 知识点三:函数调用和数组...

    C程序设计试题n套C程序设计试题n套.doc

    第三题是求500以内能被5或9整除的自然数倒数之和,可以使用两个for循环分别处理5和9的倍数,然后将它们的倒数相加,最后保留两位小数。结果是约98.98。 第三套题目中,第一题是寻找20到700之间的素数个数,原程序的...

    中北大学阿尔法编程之分治算法

    ### 中北大学阿尔法编程之分治算法 #### 一、整数划分问题 在整数划分问题中,目标是将一个整数划分为...以上四个问题的解决方案涵盖了分治算法的基本思想和实现技巧,有助于深入理解并应用于实际问题解决过程中。

    java实验大数相加.doc

    private static double factorial(int n) { if (n ) return 1; return n * factorial(n - 1); } ``` ##### 3. 折半查找 - **背景**:对于已排序的序列,折半查找是一种高效的查找方法。 - **实现思路**: - 随机...

    3d0d101469ca04a60d47aa4db69c86f5.pptx

    `的结果将会是`double`类型,因为long和double的相加也会导致结果类型提升为double。 对于字符相加,`byte`、`short`和`char`这三种类型在运算时会先被提升为`int`,然后再进行计算。这是因为`char`在Java中被视为...

    求数组的平均数1

    为了解决这个问题,描述中提出了一个巧妙的方法,使用动态更新平均数的策略,而不是一次性计算总和然后再除以元素个数。具体步骤如下: 1. 初始化一个double类型的变量ever,将其设置为数组的第一个元素src[0]。 2....

Global site tag (gtag.js) - Google Analytics