我读过以下内容:
他们解释“如何”。我想知道为什么这些语言之间是不同的。在输入相同的情况下,我期望得到类似的结果。
test.js
#!/usr/bin/env node
var nine = 9.0;
var pointOhOhOne = 0.001;
var result = nine * pointOhOhOne;
console.log(result);
test.java
public class test {
public static void main(String[] argv) {
double nine = 9.0d;
double pointOhOhOne = 0.001d;
double result = nine * pointOhOhOne;
System.out.println(result);
}
}
test.c
#include "stdio.h"
int main() {
double nine = 9.0;
double pointOhOhOne = 0.001;
double result = nine * pointOhOhOne;
printf("%f", result);
}
test.rb
#!/usr/bin/env ruby
nine = 9.0
pointOhOhOne = 0.001
result = nine * pointOhOhOne
print result
test.py
#!/usr/bin/env python
nine = 9.0
pointOhOhOne = 0.001
result = nine * pointOhOhOne
print result
结果:
ruby 0.009000000000000001
python 0.009
node 0.009000000000000001
java 0.009000000000000001
c 0.009000
发布于 2014-10-03 05:27:17
@ouah建立了所有语言的行为都是一样的。我的回答旨在解释为什么它们看起来不同。只有C和Python这两种语言的输出是“不同的”。
显然,除了C和Python之外,每种语言都只是将浮点值打印到尽可能多的小数位。
C很容易解释。您可以使用printf("%f", result)
,但不指定显式精度值。正如@ouah所指出的,将精度设置为18将产生“预期”的输出。
Python就有点棘手了。Python3.1引入了一种新的浮点repr
算法,基于David Gay的工作。与该特性对应的Python问题在这里:http://bugs.python.org/issue1580。这个特性也被移植到了Python2.7。
这个新特性的目的既是为了减少对浮点数的混淆(尽管这是值得怀疑的),更重要的是在不影响往返行为的情况下提供更易读的、更短的浮点数表示;也就是说,即使repr(x)
因此算法而缩短,float(repr(x))
也始终等于x
。因此,该算法设法在保持“无损”的同时产生更短的浮点表示:双赢!
官方的描述说明了这一点:
的repr(1.1)的新算法更智能,返回'1.1‘。它有效地搜索所有等效的字符串表示(以相同的基础浮点值存储的字符串),并返回最短的表示。
发布于 2014-10-03 04:22:45
在我的系统上使用C语言:
printf("%.18f\n", result);
0.009000000000000001
在我的系统上的Python中:
print("%.18f" % result)
0.009000000000000001
C或Python与其他语言一样,默认情况下使用其print函数限制小数位数。
https://stackoverflow.com/questions/26168930
复制相似问题