java - Java、C、C++等中十进制数的精度

标签 java c++ c decimal decimal-point

假设我们有这种循环(伪代码)

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

所以我的问题是:

  1. 为什么这个简单的代码在 Java 中打印得如此糟糕,而在 C 中却是正确的?
  2. 这在其他语言中表现如何?

最佳答案

如回答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/

相关文章:

java - jpanels之间不需要的空间

java - 避免在涉及类的运行时传递的一般情况下进行不安全转换

java - 我添加了滚动条,但它不会在框架中上下滚动

java - 未在 IntelliJ 中找到匹配方法 main 的测试

C++ ofstream System.AccessViolation

c++ - 如何防止或关闭位图的 direct2d "autoscaling"?

c++ - 指向销毁类失效的指针

c - 打印 for 循环迭代的最终值

c++ - C Header 定义顺序/位置

c - 在 c 中调用 select 后超时是否改变?