-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);

結果は次のとおりです。

ここに画像の説明を入力

全体像が見えていないかもしれませんが、地球の反対側にいるプログラマーからスクリプト ファイルが送られてきたら、私 (および彼) は結果が一貫していることを期待しています! (問題のある基数 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) 定義上、値が「正確」であることはめったにありません。

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 に答える
2

これはエラーではありません。あなたが目にしているのは、コンピューターが 10 進数を格納する方法です。この問題はかなり複雑です... コンピューターは 10 進数の正確な数値を記憶することはできません。

これを取得することは珍しくありません。この状況で私がお勧めするのは、数値を希望する小数点以下の桁数 (たとえば、100 分の 1 の桁数) に丸めることです。しかし、これはより大きな数を扱う場合にのみ機能します。より小さく、より正確な小数を処理したい場合は、それを処理するか、スーパー コンピューターを取得する必要があります。

于 2012-12-02T06:38:42.263 に答える