先看下面的例子:
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类型的数据相加,到最后得出的金额比正确数值总是少了几毛钱。以为是程序里的计算方法有问题,可是排查了很多地方,始终没有找到问题出在哪里。最后干脆把...
为了解决这个问题,我们首先需要理解曼哈顿距离的特性。曼哈顿距离是一种特殊的距离度量方法,它计算的是两个点在坐标轴上的投影距离之和。因此,对于每一个维度(x坐标或y坐标),我们需要找到一个最佳的位置,使得...
为了解决这一问题,可以使用两个`double`变量来构建一个名为`doubledouble`的结构。该结构能够提供比单一`double`类型更高的精度,达到大约30位有效数字的水平。这种方法通过组合两个`double`值来表示一个更大的数值...
我们声明了一个double类型的变量points,并将其输入。然后,我们使用switch语句来判断等级,并将结果输出。 知识点: * 开关语句的使用 * 变量声明和赋值 例6:辗转相除法-求最大公约数 在这个例子中,我们使用...
- `double* Add(double* x, double* y, int size)`:该函数接收两个双精度浮点数数组的指针及数组的大小作为参数,返回两个数组对应元素相加的结果数组。 - `void main()`:主函数,程序的入口点,负责调用其他...
这个过程通常涉及嵌套循环,时间复杂度为O(n^2),其中n是两个多项式项的总数。由于这部分代码在给定的部分内容中没有直接给出,所以在这里不进行详细展开,但可以理解为一个类似于多项式相加的扩展过程,只是乘法...
+ cx^2 + dx + e \),其中 \( a, b, ..., d, e \) 是系数,\( x \) 是变量,\( n \) 是一个非负整数。一元多项式的加减操作相对简单,遵循基本的代数规则:同类项相加减。 在给定的标题和描述中,我们关注的是如何...
`Addpolyn`函数实现了两个多项式的相加操作,其核心在于遍历两个链表,比较每个节点的指数大小,进行相应的合并操作。如果两个多项式的某项指数相同,则将对应的系数相加;如果不同,则将较小指数的项直接添加到结果...
printf("%g + %gi\n", c.real, c.imag); } Complex inputComplex() { Complex c; printf("请输入复数(形式:实部+虚部i):"); scanf("%lf%*c%lf", &c.real, &c.imag); return c; } ``` 最后,我们可以编写...
矩阵的相加操作可以通过创建一个新的矩阵,并将两个矩阵的元素逐个相加实现。 6. 矩阵的相乘操作 矩阵的相乘是将两个矩阵的元素逐个相乘的操作。例如,如果两个矩阵的大小分别是m*n和n*p,那么它们的乘积矩阵的...
否则,它会递归地调用自身来计算F(n-1)和F(n-2),然后将它们相加得到F(n)。 在进行实验时,需要注意递归可能导致栈溢出,因为每次函数调用都会在内存栈上分配空间。对于较大的n值,你可能需要考虑使用非递归方法,...
在这个编程任务中,我们需要创建两个类,一个基类 `Rectangle` 表示矩形,一个派生类 `Cube` 表示正方体。以下是详细的知识点解释: 1. **基类 Rectangle** - `Rectangle` 类有四个私有成员变量 `x1`, `y1`, `x2`,...
1.3.7. n 个数字(0,1,…,n-1)形成一个圆圈 .................................................. 53 1.3.8. 定义 Fibonacci 数列 ...............................................................................
通过循环遍历1到N的所有整数,并利用`log10()`函数计算每个整数的对数值,最后将所有对数值相加得到结果。通过取整并加1得到N!的位数,并打印输出。 ### 总结 本文介绍了一种简单有效的方法来计算N!的位数,该方法...
double fun (int n) { int a, b, c, k; double s; s = 0.0; a = 2; b = 1; for (k = 1; k <= n; k++) { s = s + (double)a / b; c = a; a = a + b; b = c; } return s; } ``` 知识点三:函数调用和数组...
第三题是求500以内能被5或9整除的自然数倒数之和,可以使用两个for循环分别处理5和9的倍数,然后将它们的倒数相加,最后保留两位小数。结果是约98.98。 第三套题目中,第一题是寻找20到700之间的素数个数,原程序的...
### 中北大学阿尔法编程之分治算法 #### 一、整数划分问题 在整数划分问题中,目标是将一个整数划分为...以上四个问题的解决方案涵盖了分治算法的基本思想和实现技巧,有助于深入理解并应用于实际问题解决过程中。
private static double factorial(int n) { if (n ) return 1; return n * factorial(n - 1); } ``` ##### 3. 折半查找 - **背景**:对于已排序的序列,折半查找是一种高效的查找方法。 - **实现思路**: - 随机...
`的结果将会是`double`类型,因为long和double的相加也会导致结果类型提升为double。 对于字符相加,`byte`、`short`和`char`这三种类型在运算时会先被提升为`int`,然后再进行计算。这是因为`char`在Java中被视为...
为了解决这个问题,描述中提出了一个巧妙的方法,使用动态更新平均数的策略,而不是一次性计算总和然后再除以元素个数。具体步骤如下: 1. 初始化一个double类型的变量ever,将其设置为数组的第一个元素src[0]。 2....