假设我们有这种循环(伪代码)
double d = 0.0
for i in 1..10 {
d = d + 0.1
print(d)
}
在 C 语言中 printf("%f", d)
我明白了:
0.100000
0.200000
0.300000
...
1.000000
在 C++ 中使用 cout << d
我明白了:
0.1
0.2
...
1
在 Java 中使用 System.out.println(d)
我明白了:
0.1
0.2
0.3 (in debug mode, I see 0.30000000000004 there but it prints 0.3)
...
0.7
0.799999999999999
0.899999999999999
0.999999999999999
所以我的问题是:
- 为什么这个简单的代码在 Java 中打印得如此糟糕,而在 C 中却是正确的?
- 这在其他语言中表现如何?
最佳答案
如回答here ,这与任何语言无关。
参见此处:What Every Programmer Should Know About Floating-Point Arithmetic
实数是无限的。计算机使用的位数有限(今天是 32 位、64 位)。因此计算机进行的浮点运算不能代表所有的实数。 0.1 是这些数字之一。
请注意,这不是与 Ruby 相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。
关于java - Java、C、C++等中十进制数的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8896253/