首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么浮点运算在某些语言中显示不同?

为什么浮点运算在某些语言中显示不同?
EN

Stack Overflow用户
提问于 2014-10-03 04:16:53
回答 2查看 1.2K关注 0票数 18

我读过以下内容:

他们解释“如何”。我想知道为什么这些语言之间是不同的。在输入相同的情况下,我期望得到类似的结果。

test.js

代码语言:javascript
复制
#!/usr/bin/env node

var nine = 9.0;
var pointOhOhOne = 0.001;
var result = nine * pointOhOhOne;
console.log(result);

test.java

代码语言:javascript
复制
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

代码语言:javascript
复制
#include "stdio.h"

int main() {
  double nine = 9.0;
  double pointOhOhOne = 0.001;
  double result = nine * pointOhOhOne;
  printf("%f", result);
}

test.rb

代码语言:javascript
复制
#!/usr/bin/env ruby

nine = 9.0
pointOhOhOne = 0.001
result = nine * pointOhOhOne

print result

test.py

代码语言:javascript
复制
#!/usr/bin/env python

nine = 9.0
pointOhOhOne = 0.001
result = nine * pointOhOhOne

print result

结果:

代码语言:javascript
复制
ruby     0.009000000000000001
python   0.009
node     0.009000000000000001
java     0.009000000000000001
c        0.009000

要点:https://gist.github.com/reklis/6694ad5fb01991a79a1a

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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‘。它有效地搜索所有等效的字符串表示(以相同的基础浮点值存储的字符串),并返回最短的表示。

票数 16
EN

Stack Overflow用户

发布于 2014-10-03 04:22:45

在我的系统上使用C语言:

代码语言:javascript
复制
printf("%.18f\n", result);

0.009000000000000001

在我的系统上的Python中:

代码语言:javascript
复制
print("%.18f" % result)

0.009000000000000001

C或Python与其他语言一样,默认情况下使用其print函数限制小数位数。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26168930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档