-1

可能的重复:
JavaScript 的数学被破坏了吗?

我写了一些动态运行 Python 代码的简单 C# 代码(已经实现):

string code = @"100 * 2 + 4 / 3";
ScriptEngine engine = Python.CreateEngine();
ScriptSource source = engine.CreateScriptSourceFromString(code, SourceCodeKind.Expression);
int res = source.Execute<int>();
Console.WriteLine(res);

然后我想到了 Javascript,C# 和 JS 之间存在核心差异。例如:

在 JS 中:

var t=1.02+1.01 = 2.0300000000000002;

然后我通过Jint尝试了这个:

var script = @"
  function add( ) {
    return 1.02 + 1.01;
  };
  return add();";
  var result = new JintEngine().Run(script);
  Console.WriteLine(result);

结果是:

在此处输入图像描述

也许我没有看到全貌,但是如果世界另一端的程序员向我发送他的脚本文件,我(和他)希望结果是一致的!(让我们暂时忽略有问题的 base 2 表示,我说的是一致性)。

如果我弄错了,在什么情况下我会使用在 .Net 上运行其他代码?(我必须对每一行代码都非常非常怀疑......)

我对吗 ?

另一个例子 :

   var script = @"
                               function show( )
                               {
                                      return  parseInt('123asd'); //in js it's 123
                               };
                               return show();";

                var result = new JintEngine().Run(script);
                Console.WriteLine(result);

结果 :

在此处输入图像描述

我如何相信脚本会产生相同的预期结果?(或者我把整个情况弄错了......?)

4

2 回答 2

2

这没有错误,您所看到的是计算机如何存储十进制数。这个主题相当复杂......计算机无法存储十进制数的确切数字,当您将 1.01 和 1.02 相加时,您得到的正是计算机认为的结果。

你得到这个并不罕见。我建议你在这种情况下做的是将数字四舍五入到你想要的小数位置(例如百分之一位置,为你)。但这仅在处理更大的数字时才有效。当您想处理更小、更精确的小数时,您将不得不处理它,或者获得一台超级计算机。

于 2012-12-02T06:38:42.263 回答
2

我没有看到任何“不一致”。这就是浮点数的工作原理!

1) 价值——根据定义——很少是“精确的”

2)如果您尝试打印出比您的值精度更多的数字,则表示(例如从打印到字符串)可能会完全误导:)

示例 C 代码

#include <stdio.h>

int 
main ()
{
  double d = 1.02 + 1.01;
  float f = 1.02 + 1.01;
  printf ("d=%lf, f=%f\n", d, f);
  printf ("d=%25.20lf, f=%25.20f\n", d, f);
  return 0;
}

样本输出:

d=2.030000, f=2.030000
d=   2.03000000000000020000, f=   2.02999997138977050000

优秀文章:

最后,请阅读此讨论:

问题不是 Python,不是 C#,不是 Javascript。

我向你们保证 :)

于 2012-12-02T06:45:36.903 回答